[INFO] cloning repository https://github.com/chrisfentiman/creft
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/chrisfentiman/creft" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fchrisfentiman%2Fcreft", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fchrisfentiman%2Fcreft'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 3675a38227d772c58d4fcf0d9d1ed7d873df3e54
[INFO] testing chrisfentiman/creft against try#b8e88e5ddf5521a9f43ee3f62a702388c713e4bb for pr-155114
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fchrisfentiman%2Fcreft" "/workspace/builds/worker-3-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc2/source'...
[INFO] [stderr] done.
[INFO] removed /workspace/builds/worker-3-tc2/source/rust-toolchain.toml
[INFO] started tweaking git repo https://github.com/chrisfentiman/creft
[INFO] finished tweaking git repo https://github.com/chrisfentiman/creft
[INFO] tweaked toml for git repo https://github.com/chrisfentiman/creft written to /workspace/builds/worker-3-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/chrisfentiman/creft on toolchain b8e88e5ddf5521a9f43ee3f62a702388c713e4bb
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+b8e88e5ddf5521a9f43ee3f62a702388c713e4bb" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/chrisfentiman/creft already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+b8e88e5ddf5521a9f43ee3f62a702388c713e4bb" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+b8e88e5ddf5521a9f43ee3f62a702388c713e4bb" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 0cb0759698fa0b7a2f5faf6005b73b3bd68d81502bb2068a2cf13a0008d70b4c
[INFO] running `Command { std: "docker" "start" "-a" "0cb0759698fa0b7a2f5faf6005b73b3bd68d81502bb2068a2cf13a0008d70b4c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "0cb0759698fa0b7a2f5faf6005b73b3bd68d81502bb2068a2cf13a0008d70b4c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "0cb0759698fa0b7a2f5faf6005b73b3bd68d81502bb2068a2cf13a0008d70b4c", kill_on_drop: false }`
[INFO] [stdout] 0cb0759698fa0b7a2f5faf6005b73b3bd68d81502bb2068a2cf13a0008d70b4c
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+b8e88e5ddf5521a9f43ee3f62a702388c713e4bb" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 58865b0cd845318636ad5d24d07cca5a1240a37657a74e3ca9d19ae9daff722d
[INFO] running `Command { std: "docker" "start" "-a" "58865b0cd845318636ad5d24d07cca5a1240a37657a74e3ca9d19ae9daff722d", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling cc v1.2.58
[INFO] [stderr]    Compiling httparse v1.10.1
[INFO] [stderr]    Compiling portable-atomic v1.13.1
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling simd-adler32 v0.3.9
[INFO] [stderr]    Compiling log v0.4.29
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling rustls v0.23.37
[INFO] [stderr]    Compiling http v1.4.0
[INFO] [stderr]    Compiling miniz_oxide v0.8.9
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling signal-hook v0.4.4
[INFO] [stderr]    Compiling redb v4.1.0
[INFO] [stderr]    Compiling hashlink v0.11.0
[INFO] [stderr]    Compiling flate2 v1.1.9
[INFO] [stderr]    Compiling ureq-proto v0.6.0
[INFO] [stderr]    Compiling unit-prefix v0.5.2
[INFO] [stderr]    Compiling utf8-zero v0.8.1
[INFO] [stderr]    Compiling getrandom v0.2.17
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling is-terminal v0.4.17
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling console v0.16.3
[INFO] [stderr]    Compiling arraydeque v0.5.1
[INFO] [stderr]    Compiling yansi v1.0.1
[INFO] [stderr]    Compiling yaml-rust2 v0.11.0
[INFO] [stderr]    Compiling indicatif v0.18.4
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling shell-escape v0.1.5
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling lexopt v0.3.2
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling rustls-webpki v0.103.13
[INFO] [stderr]    Compiling ureq v3.3.0
[INFO] [stderr]    Compiling creft v0.4.1 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 06s
[INFO] running `Command { std: "docker" "inspect" "58865b0cd845318636ad5d24d07cca5a1240a37657a74e3ca9d19ae9daff722d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "58865b0cd845318636ad5d24d07cca5a1240a37657a74e3ca9d19ae9daff722d", kill_on_drop: false }`
[INFO] [stdout] 58865b0cd845318636ad5d24d07cca5a1240a37657a74e3ca9d19ae9daff722d
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+b8e88e5ddf5521a9f43ee3f62a702388c713e4bb" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] a551d397a2cac11f28fc020353590055c2a06710eaf514cf115e8ca546dd7d19
[INFO] running `Command { std: "docker" "start" "-a" "a551d397a2cac11f28fc020353590055c2a06710eaf514cf115e8ca546dd7d19", kill_on_drop: false }`
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling winnow v1.0.0
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling semver v1.0.27
[INFO] [stderr]    Compiling futures-core v0.3.32
[INFO] [stderr]    Compiling slab v0.4.12
[INFO] [stderr]    Compiling toml_datetime v1.1.0+spec-1.1.0
[INFO] [stderr]    Compiling predicates-core v1.0.10
[INFO] [stderr]    Compiling smallvec v1.15.1
[INFO] [stderr]    Compiling rustc_version v0.4.1
[INFO] [stderr]    Compiling float-cmp v0.10.0
[INFO] [stderr]    Compiling indexmap v2.13.0
[INFO] [stderr]    Compiling termtree v0.5.1
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling relative-path v1.9.3
[INFO] [stderr]    Compiling rstest_macros v0.26.1
[INFO] [stderr]    Compiling assert_cmd v2.2.1
[INFO] [stderr]    Compiling difflib v0.4.0
[INFO] [stderr]    Compiling normalize-line-endings v0.3.0
[INFO] [stderr]    Compiling glob v0.3.3
[INFO] [stderr]    Compiling sdd v3.0.10
[INFO] [stderr]    Compiling scc v2.4.0
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling predicates-tree v1.0.13
[INFO] [stderr]    Compiling toml_parser v1.1.0+spec-1.1.0
[INFO] [stderr]    Compiling wait-timeout v0.2.1
[INFO] [stderr]    Compiling futures-timer v3.0.3
[INFO] [stderr]    Compiling pretty_assertions v1.4.1
[INFO] [stderr]    Compiling toml_edit v0.25.8+spec-1.1.0
[INFO] [stderr]    Compiling proc-macro-crate v3.5.0
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling bstr v1.12.1
[INFO] [stderr]    Compiling predicates v3.1.4
[INFO] [stderr]    Compiling futures-macro v0.3.32
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling serial_test_derive v3.4.0
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling rstest v0.26.1
[INFO] [stderr]    Compiling serial_test v3.4.0
[INFO] [stderr]    Compiling creft v0.4.1 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 39s
[INFO] running `Command { std: "docker" "inspect" "a551d397a2cac11f28fc020353590055c2a06710eaf514cf115e8ca546dd7d19", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "a551d397a2cac11f28fc020353590055c2a06710eaf514cf115e8ca546dd7d19", kill_on_drop: false }`
[INFO] [stdout] a551d397a2cac11f28fc020353590055c2a06710eaf514cf115e8ca546dd7d19
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+b8e88e5ddf5521a9f43ee3f62a702388c713e4bb" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] 724a4227f063b9f1076a57936379bb1f88b75f982197b94d873235e1310332b4
[INFO] running `Command { std: "docker" "start" "-a" "724a4227f063b9f1076a57936379bb1f88b75f982197b94d873235e1310332b4", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.26s
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/creft-b8bb7333daa813dd)
[INFO] [stdout] 
[INFO] [stdout] running 1809 tests
[INFO] [stdout] test aliases::tests::alias_new_accepts_at_and_exclamation ... ok
[INFO] [stdout] test aliases::tests::alias_new_rejects_empty_from ... ok
[INFO] [stdout] test aliases::tests::alias_file_round_trips ... ok
[INFO] [stdout] test aliases::tests::alias_new_rejects_invalid_segment::case_1_dotdot_in_from ... ok
[INFO] [stdout] test aliases::tests::alias_new_rejects_empty_to ... ok
[INFO] [stdout] test aliases::tests::alias_new_rejects_invalid_segment::case_3_dot_segment ... ok
[INFO] [stdout] test aliases::tests::alias_new_rejects_invalid_segment::case_4_backslash_segment ... ok
[INFO] [stdout] test aliases::tests::alias_new_valid_single_segment ... ok
[INFO] [stdout] test aliases::tests::alias_new_valid_multi_segment ... ok
[INFO] [stdout] test aliases::tests::boolean_keyword_from_round_trips_as_string ... ok
[INFO] [stdout] test aliases::tests::load_missing_file_returns_empty ... ok
[INFO] [stdout] test aliases::tests::load_entry_with_slash_in_from_produces_frontmatter_error ... ok
[INFO] [stdout] test aliases::tests::alias_map_loads_global_only_when_no_local_root ... ok
[INFO] [stdout] test aliases::tests::load_malformed_yaml_returns_frontmatter_error_with_path ... ok
[INFO] [stdout] test aliases::tests::double_space_in_from_normalizes_to_single_space_on_save ... ok
[INFO] [stdout] test aliases::tests::load_whitespace_only_from_produces_error ... ok
[INFO] [stdout] test aliases::tests::rewrite_creft_internal_prefix_never_rewritten ... ok
[INFO] [stdout] test aliases::tests::rewrite_shorter_match_when_longer_does_not_apply ... ok
[INFO] [stdout] test aliases::tests::rewrite_single_segment_alias::case_1_single_prefix ... ok
[INFO] [stdout] test aliases::tests::rewrite_is_single_hop_not_transitive ... ok
[INFO] [stdout] test aliases::tests::rewrite_single_segment_alias::case_2_no_remainder ... ok
[INFO] [stdout] test aliases::tests::rewrite_single_segment_alias::case_3_non_matching ... ok
[INFO] [stdout] test aliases::tests::rewrite_single_segment_alias::case_5_help_at_index_one ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_duplicate_plugin_names_rejected ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_empty_plugin_name_rejected ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_empty_plugins_array ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_error_names_catalog_source ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_malformed_entry::case_1_missing_source ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_malformed_entry::case_2_bad_typed_source ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_malformed_json_returns_catalog_parse_error ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_missing_plugins_key ... ok
[INFO] [stdout] test aliases::tests::alias_new_rejects_invalid_segment::case_2_slash_in_to ... ok
[INFO] [stdout] test aliases::tests::rewrite_single_segment_alias::case_4_empty ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_multiple_plugins ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_single_path_source ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_optional_fields_default ... ok
[INFO] [stdout] test aliases::tests::alias_map_local_overrides_global ... ok
[INFO] [stdout] test aliases::tests::rewrite_longest_match_wins_over_shorter ... ok
[INFO] [stdout] test cli::tests::add_flag_handler_is_one_source_of_truth ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_typed_git_source ... ok
[INFO] [stdout] test catalog::tests::parse_catalog_typed_github_source ... ok
[INFO] [stdout] test aliases::tests::rewrite_single_segment_alias::case_6_list_at_index_one ... ok
[INFO] [stdout] test aliases::tests::save_empty_writes_zero_bytes_and_loads_back_as_empty ... ok
[INFO] [stdout] test cli::tests::add_test_docs_returns_docs_variant ... ok
[INFO] [stdout] test cli::tests::add_test_force_flag_sets_force_true ... ok
[INFO] [stdout] test cli::tests::add_test_help_returns_help_variant ... ok
[INFO] [stdout] test cli::tests::add_with_no_test_keyword_keeps_existing_behavior ... ok
[INFO] [stdout] test cli::tests::add_test_routes_to_add_test_variant ... ok
[INFO] [stdout] test cli::tests::add_with_unknown_positional_returns_usage_error ... ok
[INFO] [stdout] test cli::tests::completions_help_returns_help_variant ... ok
[INFO] [stdout] test cli::tests::completions_missing_shell_returns_missing_arg_error ... ok
[INFO] [stdout] test cli::tests::completions_with_shell_parses_correctly ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_1_completions ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_4_doctor ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_2_add ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_3_list ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_5_plugin ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_6_settings ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_7_skills ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_8_up ... ok
[INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_9_init ... ok
[INFO] [stdout] test cli::tests::docs_followed_by_flag_returns_docs_not_search ... ok
[INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_1_add ... ok
[INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_2_list ... ok
[INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_4_remove ... ok
[INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_6_doctor ... ok
[INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_5_up ... ok
[INFO] [stdout] test cli::tests::docs_with_query_returns_docs_search_variant ... ok
[INFO] [stdout] test cli::tests::list_names_long_flag_sets_names_true ... ok
[INFO] [stdout] test cli::tests::list_names_short_flag_sets_names_true ... ok
[INFO] [stdout] test cli::tests::list_without_names_flag_defaults_false ... ok
[INFO] [stdout] test cli::tests::plugin_install_accepts_source_without_plugin_flag ... ok
[INFO] [stdout] test cli::tests::plugin_install_short_flag_p_rejected ... ok
[INFO] [stdout] test cli::tests::plugin_install_rejects_plugin_flag ... ok
[INFO] [stdout] test cli::tests::remove_bare_positional_returns_bare_skill_name_error::case_1_single_bare ... ok
[INFO] [stdout] test cli::tests::remove_bare_positional_returns_bare_skill_name_error::case_2_two_bare_first_triggers ... ok
[INFO] [stdout] test cli::tests::remove_bare_positional_returns_bare_skill_name_error::case_3_global_before_bare ... ok
[INFO] [stdout] test cli::tests::remove_bare_positional_returns_bare_skill_name_error::case_4_short_global_before_bare ... ok
[INFO] [stdout] test cli::tests::remove_bare_positional_returns_bare_skill_name_error::case_5_skill_flag_then_extra_positional ... ok
[INFO] [stdout] test cli::tests::remove_no_args_returns_usage_containing_skill_and_subcommand ... ok
[INFO] [stdout] test cli::tests::remove_skill_flag_with_empty_value_returns_usage_error ... ok
[INFO] [stdout] test cli::tests::remove_skill_flag_with_long_global_parses_global_true ... ok
[INFO] [stdout] test cli::tests::remove_skill_flag_with_namespaced_skill_parses_correctly ... ok
[INFO] [stdout] test cli::tests::remove_skill_flag_with_short_global_parses_global_true ... ok
[INFO] [stdout] test cli::tests::remove_skill_flag_without_value_returns_usage_error ... ok
[INFO] [stdout] test cli::tests::remove_test_docs_returns_docs_variant ... ok
[INFO] [stdout] test cli::tests::remove_test_docs_with_query_returns_docs_search_variant ... ok
[INFO] [stdout] test cli::tests::remove_test_empty_required_flag_returns_cannot_be_empty::case_1_empty_skill ... ok
[INFO] [stdout] test cli::tests::remove_skill_flag_parses_to_remove_command ... ok
[INFO] [stdout] test cli::tests::remove_test_empty_required_flag_returns_cannot_be_empty::case_2_empty_name ... ok
[INFO] [stdout] test cli::tests::remove_test_flags_in_any_order_parse_identically ... ok
[INFO] [stdout] test cli::tests::remove_test_help_flags_return_remove_test_help::case_2_help_short ... ok
[INFO] [stdout] test cli::tests::remove_test_help_flags_return_remove_test_help::case_1_help_long ... ok
[INFO] [stdout] test cli::tests::remove_test_missing_required_flag_returns_usage::case_1_bare ... ok
[INFO] [stdout] test cli::tests::remove_test_missing_required_flag_returns_usage::case_2_missing_name ... ok
[INFO] [stdout] test cli::tests::remove_test_skill_and_name_flags_parse_to_remove_test_command ... ok
[INFO] [stdout] test cli::tests::remove_test_missing_required_flag_returns_usage::case_3_missing_skill ... ok
[INFO] [stdout] test cli::tests::remove_test_positional_after_flags_returns_usage_error ... ok
[INFO] [stdout] test cli::tests::remove_test_unknown_token_returns_usage_error::case_1_bogus_flag ... ok
[INFO] [stdout] test cli::tests::root_docs_with_query_returns_docs_search_all ... ok
[INFO] [stdout] test cli::tests::remove_test_unknown_token_returns_usage_error::case_2_positional_token ... ok
[INFO] [stdout] test cli::tests::root_docs_bare_returns_root_help ... ok
[INFO] [stdout] test cli::tests::skills_bogus_subcommand_returns_unknown_command ... ok
[INFO] [stdout] test cli::tests::skills_invocation_returns_skills_help::case_2_long_flag ... ok
[INFO] [stdout] test cli::tests::skills_invocation_returns_skills_help::case_3_short_flag ... ok
[INFO] [stdout] test cli::tests::skills_test_bare_parses_all_defaults ... ok
[INFO] [stdout] test cli::tests::skills_test_docs_flag_returns_docs ... ok
[INFO] [stdout] test cli::tests::add_test_unknown_flag_returns_usage_error ... ok
[INFO] [stdout] test cli::tests::docs_equals_form_returns_docs_search_variant ... ok
[INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_3_show ... ok
[INFO] [stdout] test cli::tests::skills_invocation_returns_skills_help::case_1_bare ... ok
[INFO] [stdout] test cli::tests::skills_test_help_flag_returns_help ... ok
[INFO] [stdout] test cli::tests::skills_test_filter_and_scenario_positional_is_usage_error ... ok
[INFO] [stdout] test cli::tests::skills_test_flags_parsed_correctly ... ok
[INFO] [stdout] test cli::tests::skills_test_third_positional_returns_usage_error ... ok
[INFO] [stdout] test cli::tests::skills_test_scenario_positional_still_works ... ok
[INFO] [stdout] test cli::tests::skills_test_with_skill_positional ... ok
[INFO] [stdout] test cli::tests::skills_test_filter_empty_pattern_is_usage_error ... ok
[INFO] [stdout] test cli::tests::skills_test_filter_with_skill_positional ... ok
[INFO] [stdout] test cli::tests::skills_test_filter_without_skill_populates_scenario_field ... ok
[INFO] [stdout] test cli::tests::skills_test_with_skill_and_scenario_positionals ... ok
[INFO] [stdout] test cli::tests::up_bare_defaults_local_false ... ok
[INFO] [stdout] test cli::tests::up_global_flag_rejected ... ok
[INFO] [stdout] test cli::tests::up_local_long_flag_sets_local_true ... ok
[INFO] [stdout] test cli::tests::up_system_with_local_flag_parses_both ... ok
[INFO] [stdout] test cli::tests::up_local_short_flag_sets_local_true ... ok
[INFO] [stdout] test cmd::alias::tests::check_conflict_rejects_creft_internal_prefix ... ok
[INFO] [stdout] test cmd::alias::tests::cycle_detection_local_shadows_global_not_cycle ... ok
[INFO] [stdout] test cmd::alias::tests::cycle_detection_direct_two_cycle ... ok
[INFO] [stdout] test cmd::alias::tests::cycle_detection_no_cycle_simple ... ok
[INFO] [stdout] test cmd::alias::tests::cycle_detection_pre_existing_disjoint_cycle_terminates ... ok
[INFO] [stdout] test cmd::alias::tests::check_conflict_rejects_reserved_names::case_3_alias_builtin ... ok
[INFO] [stdout] test cmd::alias::tests::cycle_detection_three_cycle ... ok
[INFO] [stdout] test cmd::alias::tests::check_conflict_rejects_reserved_names::case_1_add ... ok
[INFO] [stdout] test cmd::run::tests::docs_block_content_preserved_fence_stripped ... ok
[INFO] [stdout] test cmd::alias::tests::check_conflict_rejects_creft_binary_name ... ok
[INFO] [stdout] test cmd::alias::tests::check_conflict_rejects_reserved_names::case_2_list ... ok
[INFO] [stdout] test cmd::run::tests::extract_docs_query_handles_multi_word_style_query ... ok
[INFO] [stdout] test cmd::run::tests::equals_form_query_not_in_filtered_args ... ok
[INFO] [stdout] test cmd::run::tests::extract_docs_query_equals_form_returns_value_without_index ... ok
[INFO] [stdout] test cmd::run::tests::executable_code_blocks_are_stripped ... ok
[INFO] [stdout] test cmd::run::tests::extract_docs_query_returns_none_when_next_arg_is_flag ... ok
[INFO] [stdout] test cmd::run::tests::extract_docs_query_returns_none_for_bare_docs_flag ... ok
[INFO] [stdout] test cmd::run::tests::extract_docs_query_returns_none_when_no_docs_flag ... ok
[INFO] [stdout] test cmd::run::tests::extract_docs_query_space_form_returns_value_and_index ... ok
[INFO] [stdout] test cmd::run::tests::headers_in_prose_receive_bold_markers ... ok
[INFO] [stdout] test cmd::run::tests::malformed_frontmatter_falls_back_to_skill_name_header ... ok
[INFO] [stdout] test cmd::run::tests::space_form_query_excluded_from_filtered_args ... ok
[INFO] [stdout] test cmd::run::tests::prose_between_blocks_preserved ... ok
[INFO] [stdout] test cmd::run::tests::frontmatter_replaced_with_name_description_header ... ok
[INFO] [stdout] test cmd::run::tests::three_backtick_inside_four_backtick_fence_not_closing ... ok
[INFO] [stdout] test cmd::run::tests::three_or_more_blank_lines_collapsed_to_two ... ok
[INFO] [stdout] test cmd::run::tests::no_ansi_when_yansi_disabled ... ok
[INFO] [stdout] test cmd::run::tests::two_blank_lines_not_collapsed ... ok
[INFO] [stdout] test cmd::run::tests::skill_with_only_frontmatter_and_code_produces_header_only ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::check_body_no_name_key_rejects_body_with_name_field ... ok
[INFO] [stdout] test cmd::run::tests::four_backtick_fence_stripped_by_matching_count ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_malformed_body_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_creates_fixture_when_absent ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_missing_frontmatter_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_missing_name_field_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_missing_skill_field_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_missing_skill_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_namespaced_skill_resolves_correct_path ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_force_without_collision_warns_and_appends ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_force_without_collision_emits_added_message ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_collision_with_force_replaces ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_collision_without_force_errors ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_missing_skill_rejected ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_last_scenario_leaves_empty_or_header ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_malformed_fixture_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_appends_to_existing_fixture ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_missing_fixture_rejected ... ok
[INFO] [stdout] test cmd::skill::add_test_tests::cmd_add_test_preserves_comments_on_append ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_missing_scenario_rejected ... ok
[INFO] [stdout] test cmd::skill::tests::namespace_listing_contains_required_structural_elements ... ok
[INFO] [stdout] test cmd::skill::tests::namespace_listing_includes_namespace_name_in_usage_and_footer ... ok
[INFO] [stdout] test cmd::skill::tests::namespace_listing_includes_tagline ... ok
[INFO] [stdout] test cmd::skill::cmd_rm_tests::cmd_rm_unknown_skill_returns_error ... ok
[INFO] [stdout] test cmd::skill::tests::namespace_listing_strips_namespace_prefix_from_skill_names ... ok
[INFO] [stdout] test cmd::skill::tests::namespace_listing_usage_appears_before_skills_header ... ok
[INFO] [stdout] test cmd::skill::cmd_rm_tests::cmd_rm_with_known_skill_removes_file ... ok
[INFO] [stdout] test cmd::skill::cmd_rm_tests::cmd_rm_with_namespaced_skill_resolves_correctly ... ok
[INFO] [stdout] test cmd::skill::tests::no_truncation_when_display_limit_is_none ... ok
[INFO] [stdout] test cmd::skill::tests::truncation_footer_shown_when_entries_exceed_limit ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_removes_named_scenario ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_filter_that_empties_scenarios_returns_ok_not_error ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_preserves_comments_byte_for_byte ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_no_local_root_returns_setup_error ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_no_local_root_with_where_returns_setup_error ... ok
[INFO] [stdout] test cmd::skill::cmd_remove_test_tests::cmd_remove_test_namespaced_skill_resolves_correct_path ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_filter_narrows_to_matching_scenarios ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_filter_substring_matches_anywhere ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_skill_exact_does_not_match_substring_in_other_basename ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_scenario_filter_restricts_to_named_scenario ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_skill_glob_pattern_includes_setup_extra ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_skill_pattern_discovers_multiple_fixtures ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_where_with_skill_filter_restricts_listing ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_with_where_returns_ok_without_running_scenarios ... ok
[INFO] [stdout] test cmd::update::tests::cmd_update_proceeds_past_refusal_check_for_install_script ... ok
[INFO] [stdout] test cmd::update::tests::cmd_update_refuses_cargo_with_redirect_message ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_1_behind ... ok
[INFO] [stdout] test cmd::update::tests::cmd_update_refuses_homebrew_with_redirect_message ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_3_ahead ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_4_multi_digit_minor ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_5_malformed_installed ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_6_malformed_latest ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_7_empty_installed ... ok
[INFO] [stdout] test aliases::tests::alias_errors_have_correct_exit_codes ... ok
[INFO] [stdout] test cmd::welcome::tests::already_welcomed_false_when_no_marker ... ok
[INFO] [stdout] 
[INFO] [stdout] [38;5;178m [0m[38;5;178m█[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;142m█[0m[38;5;142m█[0m[38;5;143m█[0m[38;5;143m╗[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m [0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;73m█[0m[38;5;73m█[0m[38;5;79m╗[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;44m█[0m[38;5;44m█[0m[38;5;44m╗[0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m╔[0m[38;5;178m═[0m[38;5;142m═[0m[38;5;142m═[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m╔[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╔[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;73m═[0m[38;5;73m═[0m[38;5;79m╝[0m[38;5;43m╚[0m[38;5;43m═[0m[38;5;43m═[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m╔[0m[38;5;44m═[0m[38;5;44m═[0m[38;5;44m╝[0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m║[0m[38;5;178m [0m[38;5;142m [0m[38;5;142m [0m[38;5;143m [0m[38;5;143m [0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;107m╝[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m [0m[38;5;72m [0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;73m╗[0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m║[0m[38;5;178m [0m[38;5;142m [0m[38;5;142m [0m[38;5;143m [0m[38;5;143m [0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m╔[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m [0m[38;5;72m [0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╔[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;73m╝[0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m╚[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;142m█[0m[38;5;142m█[0m[38;5;143m█[0m[38;5;143m╗[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m║[0m[38;5;107m [0m[38;5;107m [0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m║[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m║[0m[38;5;72m [0m[38;5;72m [0m[38;5;73m [0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m [0m[38;5;178m╚[0m[38;5;178m═[0m[38;5;178m═[0m[38;5;142m═[0m[38;5;142m═[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;143m╚[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;107m [0m[38;5;107m [0m[38;5;107m╚[0m[38;5;107m═[0m[38;5;107m╝[0m[38;5;107m╚[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m╚[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m [0m[38;5;72m [0m[38;5;73m [0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m╚[0m[38;5;43m═[0m[38;5;43m╝[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] 
[INFO] [stdout]   [38;5;145mExecutable skills for Agents[0m
[INFO] [stdout]   v[38;5;102m0.4.1[0m
[INFO] [stdout] 
[INFO] [stdout]   [38;5;178mGet started:[0m
[INFO] [stdout]     [38;5;44mcreft add[0m    [38;5;145mCreate a skill from stdin[0m
[INFO] [stdout]     [38;5;44mcreft list[0m   [38;5;145mSee available skills[0m
[INFO] [stdout]     [38;5;44mcreft up[0m     [38;5;145mSet up editor integrations[0m
[INFO] [stdout] 
[INFO] [stdout]   Run creft --help for the full command reference.
[INFO] [stdout]   [38;5;145mcreft checks daily for new releases. The check carries no identifier —[0m
[INFO] [stdout]   [38;5;145monly `creft/<version> (<os>; <arch>)`. Opt out: creft settings set telemetry off[0m
[INFO] [stdout] 
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_2_up_to_date ... ok
[INFO] [stdout] test cmd::update::tests::compare_versions_cases::case_8_empty_latest ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_returns_ok_when_all_scenarios_pass ... ok
[INFO] [stdout] 
[INFO] [stdout] [38;5;178m [0m[38;5;178m█[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;142m█[0m[38;5;142m█[0m[38;5;143m█[0m[38;5;143m╗[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m [0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;73m█[0m[38;5;73m█[0m[38;5;79m╗[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;44m█[0m[38;5;44m█[0m[38;5;44m╗[0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m╔[0m[38;5;178m═[0m[38;5;142m═[0m[38;5;142m═[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m╔[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╔[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;73m═[0m[38;5;73m═[0m[38;5;79m╝[0m[38;5;43m╚[0m[38;5;43m═[0m[38;5;43m═[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m╔[0m[38;5;44m═[0m[38;5;44m═[0m[38;5;44m╝[0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m║[0m[38;5;178m [0m[38;5;142m [0m[38;5;142m [0m[38;5;143m [0m[38;5;143m [0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;107m╝[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m [0m[38;5;72m [0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;73m╗[0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] 
[INFO] [stdout] [38;5;178m [0m[38;5;178m█[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;142m█[0m[38;5;142m█[0m[38;5;143m█[0m[38;5;143m╗[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m [0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;73m█[0m[38;5;73m█[0m[38;5;79m╗[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;44m█[0m[38;5;44m█[0m[38;5;44m╗[0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m╔[0m[38;5;178m═[0m[38;5;142m═[0m[38;5;142m═[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m╔[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╔[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;73m═[0m[38;5;73m═[0m[38;5;79m╝[0m[38;5;43m╚[0m[38;5;43m═[0m[38;5;43m═[0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m╔[0m[38;5;44m═[0m[38;5;44m═[0m[38;5;44m╝[0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m║[0m[38;5;178m [0m[38;5;142m [0m[38;5;142m [0m[38;5;143m [0m[38;5;143m [0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;107m╝[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m [0m[38;5;72m [0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;73m╗[0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m║[0m[38;5;178m [0m[38;5;142m [0m[38;5;142m [0m[38;5;143m [0m[38;5;143m [0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m╔[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m [0m[38;5;72m [0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╔[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;73m╝[0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m╚[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;142m█[0m[38;5;142m█[0m[38;5;143m█[0m[38;5;143m╗[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m║[0m[38;5;107m [0m[38;5;107m [0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m║[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m║[0m[38;5;72m [0m[38;5;72m [0m[38;5;73m [0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m [0m[38;5;178m╚[0m[38;5;178m═[0m[38;5;178m═[0m[38;5;142m═[0m[38;5;142m═[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;143m╚[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;107m [0m[38;5;107m [0m[38;5;107m╚[0m[38;5;107m═[0m[38;5;107m╝[0m[38;5;107m╚[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m╚[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m [0m[38;5;72m [0m[38;5;73m [0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m╚[0m[38;5;43m═[0m[38;5;43m╝[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] 
[INFO] [stdout]   [38;5;145mExecutable skills for Agents[0m
[INFO] [stdout]   v[38;5;102m0.4.1[0m
[INFO] [stdout] 
[INFO] [stdout]   [38;5;178mGet started:[0m
[INFO] [stdout]     [38;5;44mcreft add[0m    [38;5;145mCreate a skill from stdin[0m
[INFO] [stdout]     [38;5;44mcreft list[0m   [38;5;145mSee available skills[0m
[INFO] [stdout]     [38;5;44mcreft up[0m     [38;5;145mSet up editor integrations[0m
[INFO] [stdout] 
[INFO] [stdout]   Run creft --help for the full command reference.
[INFO] [stdout]   [38;5;145mcreft checks daily for new releases. The check carries no identifier —[0m
[INFO] [stdout]   [38;5;145monly `creft/<version> (<os>; <arch>)`. Opt out: creft settings set telemetry off[0m
[INFO] [stdout] 
[INFO] [stdout] [38;5;178m█[0m[38;5;178m█[0m[38;5;178m║[0m[38;5;178m [0m[38;5;142m [0m[38;5;142m [0m[38;5;143m [0m[38;5;143m [0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m╔[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╗[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m╔[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m [0m[38;5;72m [0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╔[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;73m╝[0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] test cmd::welcome::tests::cmd_welcome_noop_when_marker_exists_and_no_force ... ok
[INFO] [stdout] test cmd::welcome::tests::cmd_welcome_writes_marker_after_run ... ok
[INFO] [stdout] test cmd::welcome::tests::grad_from_and_grad_to_are_different_colors ... ok
[INFO] [stdout] [38;5;178m╚[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;178m█[0m[38;5;142m█[0m[38;5;142m█[0m[38;5;143m█[0m[38;5;143m╗[0m[38;5;143m█[0m[38;5;143m█[0m[38;5;143m║[0m[38;5;107m [0m[38;5;107m [0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m║[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;107m█[0m[38;5;71m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m╗[0m[38;5;72m█[0m[38;5;72m█[0m[38;5;72m║[0m[38;5;72m [0m[38;5;72m [0m[38;5;73m [0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m█[0m[38;5;43m█[0m[38;5;43m║[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] [38;5;178m [0m[38;5;178m╚[0m[38;5;178m═[0m[38;5;178m═[0m[38;5;142m═[0m[38;5;142m═[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;143m╚[0m[38;5;143m═[0m[38;5;143m╝[0m[38;5;107m [0m[38;5;107m [0m[38;5;107m╚[0m[38;5;107m═[0m[38;5;107m╝[0m[38;5;107m╚[0m[38;5;107m═[0m[38;5;107m═[0m[38;5;71m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m╚[0m[38;5;72m═[0m[38;5;72m╝[0m[38;5;72m [0m[38;5;72m [0m[38;5;73m [0m[38;5;73m [0m[38;5;79m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m [0m[38;5;43m╚[0m[38;5;43m═[0m[38;5;43m╝[0m[38;5;44m [0m[38;5;44m [0m[38;5;44m [0m
[INFO] [stdout] 
[INFO] [stdout]   [38;5;145mExecutable skills for Agents[0m
[INFO] [stdout]   v[38;5;102m0.4.1[0m
[INFO] [stdout] 
[INFO] [stdout]   [38;5;178mGet started:[0m
[INFO] [stdout]     [38;5;44mcreft add[0m    [38;5;145mCreate a skill from stdin[0m
[INFO] [stdout]     [38;5;44mcreft list[0m   [38;5;145mSee available skills[0m
[INFO] [stdout] test cmd::welcome::tests::cursor_guard_compiles_and_drop_impl_exists ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_color_at_first_position_is_grad_from ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_color_at_last_position_is_grad_to ... ok
[INFO] [stdout]     creft up     Set up editor integrations
[INFO] [stdout] 
[INFO] [stdout]   Run creft --help for the full command reference.
[INFO] [stdout]   creft checks daily for new releases. The check carries no identifier —
[INFO] [stdout]   only `creft/<version> (<os>; <arch>)`. Opt out: creft settings set telemetry off
[INFO] [stdout] 
[INFO] [stdout] test cmd::welcome::tests::gradient_color_at_single_position_is_grad_from ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_line_contains_ansi_when_yansi_enabled ... ok
[INFO] [stdout] test cmd::skill::tests::truncation_footer_absent_when_entries_fit_within_limit ... ok
[INFO] [stdout] test cmd::welcome::tests::cmd_welcome_uses_static_path_when_not_a_tty ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_skill_exact_pattern_does_not_include_setup_extra ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_filter_without_skill_runs_across_all_fixtures ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_line_empty_string ... ok
[INFO] [stdout] test cmd::welcome::tests::logo_lines_fit_within_40_columns ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_line_fallback_emits_no_rgb_sequences ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_line_plain_when_yansi_disabled ... ok
[INFO] [stdout] test cmd::welcome::tests::gradient_line_single_char_uses_from_color ... ok
[INFO] [stdout] test cmd::welcome::tests::paint_fg_truecolor_emits_rgb_sequence ... ok
[INFO] [stdout] test cmd::welcome::tests::paint_fg_fallback_emits_fixed_sequence_not_rgb ... ok
[INFO] [stdout] test cmd::welcome::tests::render_static_output_contains_required_content ... ok
[INFO] [stdout] test cmd::welcome::tests::render_static_to_writer_fallback_emits_fixed_not_rgb_sequences ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_gradient_endpoints_produce_reasonable_indices ... ok
[INFO] [stdout] test cmd::welcome::tests::reveal_frame_ends_with_cursor_up_to_logo_top ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_1_pure_red ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_2_pure_green ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_3_pure_blue ... ok
[INFO] [stdout] test cmd::welcome::tests::reveal_frame_full_contains_all_logo_characters ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_4_black ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_5_white ... ok
[INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_threshold_boundaries ... ok
[INFO] [stdout] test cmd::welcome::tests::underline_frame_at_zero_contains_no_underline_chars ... ok
[INFO] [stdout] test cmd::welcome::tests::reveal_frame_at_zero_contains_only_spaces_cr_lf_and_cursor_sequences ... ok
[INFO] [stdout] test cmd::welcome::tests::underline_frame_starts_with_cursor_down_and_ends_with_cursor_up ... ok
[INFO] [stdout] test cmd::welcome::tests::underline_frame_full_width_gradient_uses_grad_from_and_grad_to ... ok
[INFO] [stdout] test cmd::welcome::tests::write_marker_content_is_version_string ... ok
[INFO] [stdout] test cmd::welcome::tests::underline_frame_full_width_contains_expected_count_of_underline_chars ... ok
[INFO] [stdout] test completions::tests::generated_script_calls_list_names::case_1_bash ... ok
[INFO] [stdout] test completions::tests::generated_script_calls_list_names::case_3_fish ... ok
[INFO] [stdout] test completions::tests::generated_script_calls_list_names::case_2_zsh ... ok
[INFO] [stdout] test completions::tests::generated_script_contains_shell_marker::case_1_bash ... ok
[INFO] [stdout] test completions::tests::generated_script_contains_shell_marker::case_3_fish ... ok
[INFO] [stdout] test completions::tests::unsupported_shell_error_names_the_shell ... ok
[INFO] [stdout] test completions::tests::unsupported_shell_returns_cli_parse_error ... ok
[INFO] [stdout] test cmd::welcome::tests::write_marker_creates_parent_directories ... ok
[INFO] [stdout] test cmd::welcome::tests::write_marker_creates_file_and_already_welcomed_returns_true ... ok
[INFO] [stdout] test completions::tests::generated_script_contains_shell_marker::case_2_zsh ... ok
[INFO] [stdout] test cmd::skills::tests::cmd_skills_test_skill_filter_restricts_to_matching_fixture ... ok
[INFO] [stdout] test completions::tests::zsh_script_is_syntactically_valid ... ok
[INFO] [stdout] test cmd::welcome::tests::cmd_welcome_force_runs_even_if_marker_exists ... ok
[INFO] [stdout] test doctor::tests::check_shell_preference_with_setting_shows_simple_label_and_name ... ok
[INFO] [stdout] test doctor::tests::extract_commands_does_not_filter_regular_commands_with_equals_in_args ... ok
[INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_1_simple_assignment ... ok
[INFO] [stdout] test completions::tests::fish_script_is_syntactically_valid ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_02_sh ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_01_bash ... ok
[INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_4_assignment_and_pipe ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_03_zsh ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_05_python3 ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_07_js ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_04_python ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_06_node ... ok
[INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_3_subshell_assignment ... ok
[INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_2_numeric_assignment ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_10_ts ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_09_typescript ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_12_unknown ... ok
[INFO] [stdout] test completions::tests::bash_script_is_syntactically_valid ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_11_perl ... ok
[INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_3_warn ... ok
[INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_4_info ... ok
[INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_5_optional ... ok
[INFO] [stdout] test doctor::tests::test_check_block_deps_node_missing_npm ... ok
[INFO] [stdout] test doctor::tests::test_check_block_deps_python_missing_uv ... ok
[INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_1_ok ... ok
[INFO] [stdout] test doctor::tests::test_check_block_deps_shell_checks_each_dep ... ok
[INFO] [stdout] test doctor::tests::test_check_block_interpreter_found ... ok
[INFO] [stdout] test doctor::tests::test_check_block_interpreter_not_found ... ok
[INFO] [stdout] test doctor::tests::run_skill_check_with_shell_pref_does_not_affect_non_shell_blocks ... ok
[INFO] [stdout] test doctor::tests::test_check_global_dir_no_home ... ok
[INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_2_fail ... ok
[INFO] [stdout] test doctor::tests::test_check_interpreter_missing_git_is_optional ... ok
[INFO] [stdout] test doctor::tests::test_check_global_dir_not_exists ... ok
[INFO] [stdout] test doctor::tests::test_check_interpreter_missing_zsh_is_optional ... ok
[INFO] [stdout] test doctor::tests::test_check_global_dir_writable ... ok
[INFO] [stdout] test doctor::tests::test_check_interpreter_unknown_missing_is_optional ... ok
[INFO] [stdout] test doctor::tests::test_check_interpreter_bash_missing_is_fail ... ok
[INFO] [stdout] test doctor::tests::test_check_llm_provider_found ... ok
[INFO] [stdout] test doctor::tests::test_check_optional_tool_found ... ok
[INFO] [stdout] test doctor::tests::test_check_llm_provider_not_found_is_optional ... ok
[INFO] [stdout] test doctor::tests::test_check_local_dir_not_found ... ok
[INFO] [stdout] test doctor::tests::test_check_optional_tool_missing ... ok
[INFO] [stdout] test doctor::tests::test_check_local_dir_found ... ok
[INFO] [stdout] test doctor::tests::run_skill_check_without_shell_pref_reports_block_lang_interpreter ... ok
[INFO] [stdout] test doctor::tests::run_skill_check_with_shell_pref_reports_resolved_interpreter_for_bash_block ... ok
[INFO] [stdout] test doctor::tests::test_describe_source_owned_global ... ok
[INFO] [stdout] test doctor::tests::test_describe_source_owned_local ... ok
[INFO] [stdout] test doctor::tests::test_describe_source_package ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_filters_builtins ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_multiline ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_comments_skipped ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_and_chain ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_simple ... ok
[INFO] [stdout] test doctor::tests::test_check_packages_broken_manifest_reported ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_subshell ... ok
[INFO] [stdout] test doctor::tests::check_shell_preference_with_no_detection_shows_none_message ... ok
[INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_08_javascript ... ok
[INFO] [stdout] test doctor::tests::test_extract_commands_pipe ... ok
[INFO] [stdout] test doctor::tests::test_extract_creft_calls_simple ... ok
[INFO] [stdout] test doctor::tests::test_extract_creft_calls_filters_reserved ... ok
[INFO] [stdout] test doctor::tests::test_extract_creft_calls_with_flags ... ok
[INFO] [stdout] test doctor::tests::test_has_failures_ignores_optional ... ok
[INFO] [stdout] test doctor::tests::test_has_failures_with_fail ... ok
[INFO] [stdout] test doctor::tests::test_extract_creft_calls_in_subshell ... ok
[INFO] [stdout] test doctor::tests::test_extract_creft_calls_namespace ... ok
[INFO] [stdout] test doctor::tests::test_llm_provider_cli_name_unknown_returns_as_is ... ok
[INFO] [stdout] test doctor::tests::test_render_global_does_not_panic ... ok
[INFO] [stdout] test doctor::tests::test_render_skill_does_not_panic ... ok
[INFO] [stdout] test doctor::tests::test_render_skill_multi_dep_blocks_does_not_panic ... ok
[INFO] [stdout] test doctor::tests::test_render_skill_with_sub_reports_does_not_panic ... ok
[INFO] [stdout] test doctor::tests::test_report_has_failures_no_fails ... ok
[INFO] [stdout] test doctor::tests::test_report_has_failures_propagates_from_sub_reports ... ok
[INFO] [stdout] test doctor::tests::test_llm_provider_cli_name_empty_defaults_to_claude ... ok
[INFO] [stdout] test doctor::tests::test_report_has_failures_with_fail_in_deps ... ok
[INFO] [stdout] test doctor::tests::test_report_has_failures_with_fail_in_commands ... ok
[INFO] [stdout] test doctor::tests::test_llm_provider_cli_name_known_providers ... ok
[INFO] [stdout] test doctor::tests::test_report_has_failures_with_fail_in_interpreter ... ok
[INFO] [stdout] test doctor::tests::test_skill_check_prev_in_shell_block_warns_not_supported ... ok
[INFO] [stdout] test doctor::tests::test_global_check_includes_packages ... ok
[INFO] [stdout] test doctor::tests::test_skill_check_creft_prev_warns_removal ... ok
[INFO] [stdout] test doctor::tests::test_global_check_returns_results ... ok
[INFO] [stdout] test doctor::tests::test_skill_check_prev_in_llm_block_is_info ... ok
[INFO] [stdout] test doctor::tests::test_global_check_includes_bash ... ok
[INFO] [stdout] test doctor::tests::test_has_failures_with_all_ok ... ok
[INFO] [stdout] test doctor::tests::test_which_path_returns_none_for_nonexistent ... ok
[INFO] [stdout] test error::tests::install_script_failed_is_quiet ... ok
[INFO] [stdout] test error::tests::test_enrich_io_error_not_found_includes_context ... ok
[INFO] [stdout] test doctor::tests::test_which_path_finds_existing ... ok
[INFO] [stdout] test error::tests::test_enrich_io_error_e2big_returns_setup ... ok
[INFO] [stdout] test error::tests::install_script_failed_propagates_exit_code ... ok
[INFO] [stdout] test error::tests::test_enrich_io_error_e2big_context_appears_in_message ... ok
[INFO] [stdout] test error::tests::test_enrich_io_error_other_passthrough_as_io ... ok
[INFO] [stdout] test error::tests::test_exit_code_alias_conflict_returns_3 ... ok
[INFO] [stdout] test error::tests::test_exit_code_alias_cycle_returns_3 ... ok
[INFO] [stdout] test error::tests::test_exit_code_alias_not_found_returns_2 ... ok
[INFO] [stdout] test error::tests::test_enrich_io_error_not_found_returns_interpreter_not_found ... ok
[INFO] [stdout] test error::tests::test_exit_code_alias_target_not_found_returns_2 ... ok
[INFO] [stdout] test doctor::tests::test_which_path_returns_absolute_path ... ok
[INFO] [stdout] test error::tests::test_exit_code_command_not_found ... ok
[INFO] [stdout] test error::tests::test_exit_code_execution_failed_returns_code_field ... ok
[INFO] [stdout] test error::tests::test_exit_code_execution_failed_zero_code ... ok
[INFO] [stdout] test error::tests::test_exit_code_execution_signaled ... ok
[INFO] [stdout] test error::tests::test_exit_code_invalid_name_returns_3 ... ok
[INFO] [stdout] test error::tests::test_exit_code_missing_arg ... ok
[INFO] [stdout] test error::tests::test_exit_code_missing_env_var ... ok
[INFO] [stdout] test error::tests::test_exit_code_package_not_found ... ok
[INFO] [stdout] test error::tests::test_exit_code_validation_failed ... ok
[INFO] [stdout] test error::tests::test_exit_code_wildcard_arm_returns_1_for_frontmatter ... ok
[INFO] [stdout] test error::tests::test_exit_code_wildcard_arm_returns_1_for_io ... ok
[INFO] [stdout] test error::tests::test_exit_code_wildcard_arm_returns_1_for_setup ... ok
[INFO] [stdout] test error::tests::test_is_quiet_command_not_found ... ok
[INFO] [stdout] test error::tests::test_is_quiet_execution_failed ... ok
[INFO] [stdout] test error::tests::test_is_quiet_execution_signaled_sigint ... ok
[INFO] [stdout] test error::tests::test_is_quiet_execution_signaled_sigkill ... ok
[INFO] [stdout] test error::tests::test_is_quiet_execution_signaled_sigterm ... ok
[INFO] [stdout] test error::tests::test_is_quiet_io ... ok
[INFO] [stdout] test frontmatter::tests::split_returns_error_for_missing_close ... ok
[INFO] [stdout] test frontmatter::tests::split_returns_error_for_missing_open ... ok
[INFO] [stdout] test frontmatter::tests::split_returns_yaml_and_body_for_unix_endings ... ok
[INFO] [stdout] test frontmatter::tests::split_returns_yaml_and_body_for_windows_endings ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_empty_name ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_missing_close ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_basic ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_missing_delimiter ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_with_args ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_without_supports ... ok
[INFO] [stdout] test frontmatter::tests::test_roundtrip ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_with_supports ... ok
[INFO] [stdout] test help::tests::all_render_docs_contain_usage_line ... ok
[INFO] [stdout] test frontmatter::tests::test_parse_with_env ... ok
[INFO] [stdout] test frontmatter::tests::test_roundtrip_ignores_legacy_pipe_field ... ok
[INFO] [stdout] test help::tests::builtins_contains_expected_commands ... ok
[INFO] [stdout] test frontmatter::tests::test_roundtrip_with_supports ... ok
[INFO] [stdout] test help::tests::builtins_descriptions_under_50_chars ... ok
[INFO] [stdout] test help::tests::builtins_descriptions_non_empty ... ok
[INFO] [stdout] test help::tests::builtins_sorted_alphabetically ... ok
[INFO] [stdout] test help::tests::builtins_returns_thirteen_entries ... ok
[INFO] [stdout] test help::tests::all_render_short_contain_docs_footer ... ok
[INFO] [stdout] test help::tests::render_short_disabled_produces_no_ansi ... ok
[INFO] [stdout] test help::tests::render_version_matches_cargo_pkg_version ... ok
[INFO] [stdout] test help::tests::no_docs_output_contains_built_in_tag ... ok
[INFO] [stdout] test install_method::tests::detect_cargo_with_cargo_home_set ... ok
[INFO] [stdout] test help::tests::all_render_short_under_20_lines ... ok
[INFO] [stdout] test install_method::tests::detect_exe_outside_cargo_bin_with_bin_dir_present_returns_install_script ... ok
[INFO] [stdout] test help::tests::render_docs_add_contains_usage_line ... ok
[INFO] [stdout] test help::tests::render_docs_disabled_produces_no_ansi ... ok
[INFO] [stdout] test install_method::tests::detect_homebrew_cellar_path ... ok
[INFO] [stdout] test install_method::tests::detect_nonexistent_path_returns_install_script ... ok
[INFO] [stdout] test install_method::tests::detect_homebrew_wins_when_cargo_home_also_matches ... ok
[INFO] [stdout] test help::tests::render_docs_enabled_produces_ansi_bold_on_headers ... ok
[INFO] [stdout] test install_method::tests::homebrew_prefix_strings_are_recognized::case_2_usr_local_homebrew ... ok
[INFO] [stdout] test install_method::tests::homebrew_prefix_strings_are_recognized::case_3_linuxbrew ... ok
[INFO] [stdout] test help::tests::render_docs_show_contains_blocks_flag ... ok
[INFO] [stdout] test install_method::tests::refusal_message_contract::case_1_homebrew ... ok
[INFO] [stdout] test install_method::tests::detect_non_homebrew_non_cargo_returns_install_script ... ok
[INFO] [stdout] test install_method::tests::refusal_message_contract::case_2_cargo ... ok
[INFO] [stdout] test install_method::tests::homebrew_prefix_strings_are_recognized::case_1_opt_homebrew ... ok
[INFO] [stdout] test install_method::tests::refusal_message_contract::case_3_install_script ... ok
[INFO] [stdout] test install_method::tests::upgrade_command_returns_correct_string::case_1_homebrew ... ok
[INFO] [stdout] test install_method::tests::upgrade_command_returns_correct_string::case_2_cargo ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_flags_only_problematic_block_in_multi_block_body ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_no_warning_for_block_with_no_inner_fences ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_no_warning_for_four_backtick_outer_with_inner_three ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_no_warning_for_unclosed_outer_block ... ok
[INFO] [stdout] test help::tests::all_render_short_contain_usage_line ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_four_bare_backticks_inside_three_backtick_block_is_not_a_closing_fence ... ok
[INFO] [stdout] test markdown::tests::four_backtick_outer_fence_treats_inner_three_backtick_examples_as_literal_content ... ok
[INFO] [stdout] test install_method::tests::upgrade_command_returns_correct_string::case_3_install_script ... ok
[INFO] [stdout] test markdown::tests::test_deps_node ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_bare_outer_fence_consumes_content_and_does_not_cause_false_positive ... ok
[INFO] [stdout] test markdown::tests::test_deps_python ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_detects_inner_fence_that_would_close_outer ... ok
[INFO] [stdout] test markdown::tests::test_docs_and_code ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_deps_are_empty ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_empty_yaml_uses_defaults ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_among_regular_blocks ... ok
[INFO] [stdout] test markdown::tests::check_fence_nesting_no_false_positive_for_echo_with_backticks_inline ... ok
[INFO] [stdout] test markdown::tests::test_empty_body ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_invalid_yaml_records_error ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_provider_only ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_multiple_separators_only_first_splits ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_model_only ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_params_field ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_no_separator_is_prompt ... ok
[INFO] [stdout] test markdown::tests::test_no_lang_tag_ignored ... ok
[INFO] [stdout] test markdown::tests::test_multiline_code ... ok
[INFO] [stdout] test markdown::tests::test_non_llm_block_with_triple_dash_in_code ... ok
[INFO] [stdout] test markdown::tests::test_non_llm_blocks_have_no_llm_config ... ok
[INFO] [stdout] test markdown::tests::test_single_bash_block ... ok
[INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_1_hidden_top_level ... ok
[INFO] [stdout] test model::tests::help_text_hides_empty_default ... ok
[INFO] [stdout] test markdown::tests::test_llm_block_with_all_fields ... ok
[INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_2_hidden_subcommand ... ok
[INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_4_underscore_mid_word ... ok
[INFO] [stdout] test model::tests::needs_sponge::case_1_llm ... ok
[INFO] [stdout] test markdown::tests::test_no_deps ... ok
[INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_5_visible ... ok
[INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_3_hidden_namespace ... ok
[INFO] [stdout] test markdown::tests::test_multiple_blocks ... ok
[INFO] [stdout] test model::tests::needs_sponge::case_2_bash ... ok
[INFO] [stdout] test model::tests::needs_sponge::case_3_python ... ok
[INFO] [stdout] test model::tests::needs_sponge::case_4_node ... ok
[INFO] [stdout] test model::tests::needs_sponge::case_5_unknown_language ... ok
[INFO] [stdout] test model::tests::test_default_env_required_is_true ... ok
[INFO] [stdout] test model::tests::test_deserialize_ignores_pipe_field ... ok
[INFO] [stdout] test model::tests::test_default_flag_type_is_string ... ok
[INFO] [stdout] test model::tests::test_deserialize_ignores_sequential_field ... ok
[INFO] [stdout] test model::tests::test_find_local_root_excludes_global_root ... ok
[INFO] [stdout] test model::tests::test_help_text ... ok
[INFO] [stdout] test model::tests::test_help_text_ansi_description_not_bold ... ok
[INFO] [stdout] test model::tests::test_find_local_root_returns_none_when_creft_home_set ... ok
[INFO] [stdout] test model::tests::test_global_root_no_home_returns_err ... ok
[INFO] [stdout] test model::tests::test_help_text_ansi_arg_names_bold ... ok
[INFO] [stdout] test model::tests::test_find_local_root_finds_real_project_root ... ok
[INFO] [stdout] test model::tests::test_help_text_ansi_default_hints_not_bold ... ok
[INFO] [stdout] test model::tests::test_help_text_ansi_flag_labels_bold ... ok
[INFO] [stdout] test model::tests::test_help_text_arg_with_default ... ok
[INFO] [stdout] test model::tests::test_help_text_ansi_section_headers_bold ... ok
[INFO] [stdout] test model::tests::test_help_text_arg_without_description_has_no_trailing_spaces ... ok
[INFO] [stdout] test model::tests::test_help_text_env_optional ... ok
[INFO] [stdout] test model::tests::test_help_text_plain_and_ansi_same_structure ... ok
[INFO] [stdout] test model::tests::test_help_text_usage_line_no_flags_no_args ... ok
[INFO] [stdout] test model::tests::test_help_text_usage_line_with_options ... ok
[INFO] [stdout] test model::tests::test_help_text_usage_line_with_optional_arg ... ok
[INFO] [stdout] test model::tests::test_help_text_string_flag_with_default ... ok
[INFO] [stdout] test model::tests::test_llm_config_deserialize_full ... ok
[INFO] [stdout] test model::tests::test_llm_config_deserialize_provider_only ... ok
[INFO] [stdout] test model::tests::test_llm_config_deserialize_defaults ... ok
[INFO] [stdout] test model::tests::test_help_text_usage_line_with_required_arg ... ok
[INFO] [stdout] test model::tests::test_name_parts_namespaced ... ok
[INFO] [stdout] test model::tests::test_name_parts_simple ... ok
[INFO] [stdout] test model::tests::test_supports_feature_empty ... ok
[INFO] [stdout] test model::tests::test_supports_feature_match ... ok
[INFO] [stdout] test model::tests::test_supports_feature_no_match ... ok
[INFO] [stdout] test namespace::tests::access_error_display_includes_resource_name ... ok
[INFO] [stdout] test namespace::tests::access_registry_default_is_empty ... ok
[INFO] [stdout] test namespace::tests::access_registry_mark_and_check_global ... ok
[INFO] [stdout] test namespace::tests::access_registry_starts_empty ... ok
[INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_1_named_namespace ... ok
[INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_2_named_namespace_with_plugin ... ok
[INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_3_root_namespace ... ok
[INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_4_root_namespace_with_plugin ... ok
[INFO] [stdout] test namespace::tests::resolve_cross_namespace_name_denied_when_not_global ... ok
[INFO] [stdout] test namespace::tests::resolve_cross_namespace_name_denied_when_not_registered ... ok
[INFO] [stdout] test namespace::tests::resolve_cross_namespace_name_succeeds_when_global ... ok
[INFO] [stdout] test namespace::tests::resolve_local_name_qualifies_without_registry_check ... ok
[INFO] [stdout] test namespace::tests::resolve_local_name_with_plugin_qualifies_correctly ... ok
[INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_1_two_part_name ... ok
[INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_2_single_token ... ok
[INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_3_three_part_name ... ok
[INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_4_empty_string ... ok
[INFO] [stdout] test registry::tests::activate_plugin_slash_cmd_activates_specific_command ... ok
[INFO] [stdout] test registry::tests::activate_returns_package_not_found_when_neither_segment_is_installed ... ok
[INFO] [stdout] test registry::tests::activate_prefers_literal_interpretation_when_first_segment_is_installed ... ok
[INFO] [stdout] test registry::tests::activate_qualified_owner_plugin_strips_owner_and_activates ... ok
[INFO] [stdout] test registry::tests::activate_bare_plugin_name_activates_all_commands ... ok
[INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_1_cmd ... ok
[INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_2_plugins ... ok
[INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_3_install ... ok
[INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_4_uninstall ... ok
[INFO] [stdout] test registry::tests::collect_plugin_skills_excludes_invalid_yaml_frontmatter_file_from_results ... ok
[INFO] [stdout] test registry::tests::collect_package_skills_silently_skips_plain_markdown_without_frontmatter ... ok
[INFO] [stdout] test registry::tests::collect_plugin_skills_silently_skips_plain_markdown_without_frontmatter ... ok
[INFO] [stdout] test registry::tests::read_manifest_from_ignores_directory_without_catalog ... ok
[INFO] [stdout] test registry::tests::collect_package_skills_excludes_invalid_yaml_frontmatter_file_from_results ... ok
[INFO] [stdout] test registry::tests::list_packages_reads_catalog_json ... ok
[INFO] [stdout] test registry::tests::read_manifest_from_reads_catalog_json ... ok
[INFO] [stdout] test registry::tests::read_manifest_from_returns_none_when_no_manifest ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_02_list ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_03_show ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_01_add ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_04_remove ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_05_plugin ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_07_up ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_09_version ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_10_init ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_11_doctor ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_06_settings ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_08_help ... ok
[INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_12_completions ... ok
[INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_1_root_match ... ok
[INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_2_root_mismatch ... ok
[INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_3_subdir_match ... ok
[INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_4_subdir_different ... ok
[INFO] [stdout] test registry::tests::test_collect_package_skills_skips_symlinks ... ok
[INFO] [stdout] test registry::tests::test_copy_dir_recursive_skips_symlinks ... ok
[INFO] [stdout] test registry::tests::test_list_package_skills_excludes_non_md_files ... ok
[INFO] [stdout] test registry::tests::test_list_package_skills_excludes_dotfiles ... ok
[INFO] [stdout] test registry::tests::test_copy_dir_recursive_skips_symlinked_dirs ... ok
[INFO] [stdout] test registry::tests::test_list_package_skills_computes_names_from_paths ... ok
[INFO] [stdout] test registry::tests::test_list_package_skills_not_found ... ok
[INFO] [stdout] test registry::tests::test_list_packages_empty_when_no_dir ... ok
[INFO] [stdout] test registry::tests::test_list_package_skills_nesting_cap ... ok
[INFO] [stdout] test registry::tests::test_list_packages_returns_installed ... ok
[INFO] [stdout] test registry::tests::test_load_package_skill_not_found_package ... ok
[INFO] [stdout] test registry::tests::test_list_packages_skips_invalid_manifest ... ok
[INFO] [stdout] test registry::tests::test_load_package_skill_too_few_tokens ... ok
[INFO] [stdout] test registry::tests::test_manifest_full_fields ... ok
[INFO] [stdout] test registry::tests::test_load_package_skill_nested ... ok
[INFO] [stdout] test registry::tests::test_manifest_missing_required_field_name ... ok
[INFO] [stdout] test registry::tests::test_manifest_missing_required_field_version ... ok
[INFO] [stdout] test registry::tests::test_manifest_optional_fields_absent ... ok
[INFO] [stdout] test registry::tests::test_manifest_missing_required_field_description ... ok
[INFO] [stdout] test registry::tests::test_load_package_skill_overrides_name ... ok
[INFO] [stdout] test registry::tests::test_load_package_skill_not_found_file ... ok
[INFO] [stdout] test registry::tests::test_move_dir_empty_directory ... ok
[INFO] [stdout] test registry::tests::test_packages_dir_different_from_commands_dir ... ok
[INFO] [stdout] test registry::tests::test_packages_dir_uses_creft_home ... ok
[INFO] [stdout] test registry::tests::test_packages_dir_for_respects_scope_under_creft_home ... ok
[INFO] [stdout] test registry::tests::test_packages_dir_creft_home_both_scopes_resolve_to_same_path ... ok
[INFO] [stdout] test registry::tests::test_skill_name_from_path_package_name_in_result ... ok
[INFO] [stdout] test registry::tests::test_skill_name_from_path_simple ... ok
[INFO] [stdout] test registry::tests::test_skill_name_from_path_three_levels ... ok
[INFO] [stdout] test registry::tests::test_move_dir_same_filesystem ... ok
[INFO] [stdout] test registry::tests::test_skill_file_path_rejects_traversal ... ok
[INFO] [stdout] test registry::tests::test_validate_manifest_name_empty ... ok
[INFO] [stdout] test registry::tests::test_skill_name_from_path_one_level_deep ... ok
[INFO] [stdout] test registry::tests::test_validate_manifest_name_invalid_chars ... ok
[INFO] [stdout] test registry::tests::test_validate_manifest_name_ok ... ok
[INFO] [stdout] test registry::tests::test_validate_manifest_name_semicolon_rejected ... ok
[INFO] [stdout] test registry::tests::test_validate_manifest_name_tabs_rejected ... ok
[INFO] [stdout] test registry::tests::test_validate_manifest_name_whitespace_rejected ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_ma ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_man ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_padding ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_rfc4648_vectors ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_username_password ... ok
[INFO] [stdout] test registry_config::tests::test_deduplication_case_insensitive ... ok
[INFO] [stdout] test registry_config::tests::test_deduplication_same_url_template ... ok
[INFO] [stdout] test registry_config::tests::test_deduplication_different_paths_not_deduped ... ok
[INFO] [stdout] test registry_config::tests::test_endpoints_for_scoped_configured ... ok
[INFO] [stdout] test registry_config::tests::test_endpoints_for_scoped_unconfigured ... ok
[INFO] [stdout] test registry_config::tests::test_endpoints_for_unscoped ... ok
[INFO] [stdout] test registry_config::tests::test_extract_host_basic ... ok
[INFO] [stdout] test registry_config::tests::test_extract_host_no_path ... ok
[INFO] [stdout] test registry_config::tests::test_extract_host_with_port ... ok
[INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_basic ... ok
[INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_inline_comment_stripped ... ok
[INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_malformed_ignored ... ok
[INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_multiple ... ok
[INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_no_sections ... ok
[INFO] [stdout] test registry::tests::update_package_name_is_reserved ... ok
[INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_skips_default ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_m ... ok
[INFO] [stdout] test registry_config::tests::test_header_value_basic ... ok
[INFO] [stdout] test registry_config::tests::test_base64_encode_empty ... ok
[INFO] [stdout] test registry_config::tests::test_is_valid_http_url_empty_rejected ... ok
[INFO] [stdout] test registry_config::tests::test_is_valid_http_url_file_scheme_rejected ... ok
[INFO] [stdout] test registry_config::tests::test_is_valid_http_url_http ... ok
[INFO] [stdout] test registry_config::tests::test_is_valid_http_url_https ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_auth_token_matched ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_basic_registry ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_empty_file ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_ignores_comments ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_malformed_lines_skipped ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_scoped_registry ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_url_without_trailing_slash ... ok
[INFO] [stdout] test registry_config::tests::test_parse_npmrc_url_with_trailing_slash ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_case_insensitive_keys ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_colon_separator ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_comment_lines_ignored ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_extra_index_url_multiline ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_extra_index_url_single ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_index_url ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_no_global_section ... ok
[INFO] [stdout] test registry_config::tests::test_pypi_endpoint_from_url_private_no_trailing_slash ... ok
[INFO] [stdout] test registry_config::tests::test_pypi_endpoint_from_url_private_uses_simple_api ... ok
[INFO] [stdout] test registry_config::tests::test_pypi_endpoint_from_url_pypi_org_uses_json_api ... ok
[INFO] [stdout] test registry_config::tests::test_redact_url_empty_string ... ok
[INFO] [stdout] test registry_config::tests::test_redact_url_no_credentials ... ok
[INFO] [stdout] test registry_config::tests::test_redact_url_user_only_no_colon ... ok
[INFO] [stdout] test registry_config::tests::test_redact_url_with_user_and_password ... ok
[INFO] [stdout] test registry_config::tests::test_registry_auth_basic_debug_shows_username_redacts_password ... ok
[INFO] [stdout] test registry_config::tests::test_registry_auth_bearer_debug_redacts_secret ... ok
[INFO] [stdout] test registry_config::tests::test_resolve_npm_default_only ... ok
[INFO] [stdout] test registry_config::tests::test_resolve_pypi_default_only ... ok
[INFO] [stdout] test registry_config::tests::test_url_for_simple ... ok
[INFO] [stdout] test registry_config::tests::test_url_for_scoped_npm ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_command_returns_error_when_llm_config_absent ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_1_claude_default ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_2_claude_with_model ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_3_gemini_with_model ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_4_codex ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_5_ollama_with_model ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_6_unknown_provider ... ok
[INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_params_split_on_whitespace ... ok
[INFO] [stdout] test runner::blocks::node::tests::build_command_without_deps_returns_bare_node_command ... ok
[INFO] [stdout] test registry_config::tests::test_parse_pip_conf_embedded_credentials ... ok
[INFO] [stdout] test runner::blocks::python::tests::build_command_no_deps_uses_python3 ... ok
[INFO] [stdout] test runner::blocks::python::tests::build_command_with_deps_uses_uv_run_with ... ok
[INFO] [stdout] test runner::blocks::python::tests::build_command_with_single_dep_uses_uv_run_with ... ok
[INFO] [stdout] test runner::blocks::shell::tests::build_command_appends_script_path_as_last_arg ... ok
[INFO] [stdout] test runner::blocks::shell::tests::build_command_bash_program_is_bash ... ok
[INFO] [stdout] test runner::blocks::shell::tests::build_command_multi_token_interpreter_splits_into_program_and_arg::case_1_typescript ... ok
[INFO] [stdout] test runner::blocks::shell::tests::build_command_multi_token_interpreter_splits_into_program_and_arg::case_2_ts ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_1_bash ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_2_sh ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_3_zsh ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_4_python ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_5_python3 ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_6_node ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_7_javascript ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_8_js ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_9_unknown ... ok
[INFO] [stdout] test runner::blocks::tests::runner_for_llm_uses_provider_as_program ... ok
[INFO] [stdout] test registry_config::tests::test_header_value_bearer ... ok
[INFO] [stdout] test registry_config::tests::test_is_valid_http_url_ftp_rejected ... ok
[INFO] [stdout] test runner::channel::tests::capped_term_width_does_not_shrink_narrow_terminals ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_exit_with_code_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::capped_term_width_does_not_exceed_max ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_index_deserializes_with_id ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_index_with_global_true_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_exit_without_code_defaults_to_zero ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_malformed_json_returns_error ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_index_with_global_false_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_print_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_index_without_global_defaults_false ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_prompt_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_search_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_1_no_progress ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_2_progress_50 ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_4_progress_hundred ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_3_progress_zero ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_store_get_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::bash_ignoring_fd3_exits_cleanly ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_store_put_global_true_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_store_put_global_false_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_store_put_deserializes_with_id ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_store_put_without_global_defaults_to_none ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_store_search_deserializes ... ok
[INFO] [stdout] test runner::channel::tests::channel_message_unknown_type_returns_error ... ok
[INFO] [stdout] test runner::channel::tests::child_fds_returns_correct_ends ... ok
[INFO] [stdout] test runner::channel::tests::exit_signal_write_then_read_roundtrips ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_global_flag_propagates ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_accumulates_documents_across_calls ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_first_document_searchable_after_second_call ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_includes_plugin_in_qualified_name ... ok
[INFO] [stdout] test runner::channel::tests::bash_writes_to_fd3_are_readable_by_parent ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_is_global_last_write_wins ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_qualifies_name_with_namespace ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_returns_ack_with_id_and_ok ... ok
[INFO] [stdout] test runner::channel::tests::close_child_ends_prevents_reader_hang ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_second_document_searchable_after_accumulation ... ok
[INFO] [stdout] test runner::channel::tests::handle_index_message_without_global_is_local ... ok
[INFO] [stdout] test runner::channel::tests::handle_prompt_non_interactive_response_is_valid_json ... ok
[INFO] [stdout] test runner::channel::tests::handle_prompt_non_interactive_writes_empty_response ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_backslash ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_cross_namespace_denied_when_not_global ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_cross_namespace_succeeds_when_global ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_multi_document_returns_content_not_doc_labels ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_double_quote ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_tab ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_returns_empty_when_no_index ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_returns_results_after_index ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_returns_content_not_doc_id ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_get_returns_empty_when_database_missing ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_get_returns_error_response_on_corrupt_database ... ok
[INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_newline ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_get_rejects_dotted_name ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_put_creates_redb_and_index_files ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_get_returns_empty_value_for_missing_key ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_get_returns_value_for_existing_key ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_put_replaces_existing_key ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_search_returns_empty_when_no_index_file ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_search_cross_namespace_succeeds_when_global ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_search_cross_namespace_denied_when_not_global ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_put_returns_ack_with_id_and_ok ... ok
[INFO] [stdout] test runner::channel::tests::json_escape_string_passthrough_for_plain_ascii ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_search_returns_matching_keys_after_put ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_search_returns_empty_when_no_match ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_search_returns_keys_via_fuzzy_fallback ... ok
[INFO] [stdout] test runner::channel::tests::new_produces_four_distinct_fds ... ok
[INFO] [stdout] test runner::channel::tests::spawn_prompt_handler_exits_when_channel_closes ... ok
[INFO] [stderr] hello
[INFO] [stdout] test runner::channel::tests::spawn_reader_drains_print_message_cleanly ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_exits_on_eof_with_no_messages ... ok
[INFO] [stdout] test runner::channel::tests::prompt_non_interactive_round_trip_does_not_deadlock ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_handles_index_then_search_round_trip ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_ignores_unknown_message_type ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_ack_for_index ... ok
[INFO] [stderr] test message
[INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_ack_for_store_put ... ok
[INFO] [stderr] Done
[INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_empty_response_for_store_get ... ok
[INFO] [stderr] ⠁ Pending                                                                       
[2K⠁ Pending                                                                       
[2KHello
[INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_empty_response_for_store_search ... ok
[INFO] [stdout] test runner::channel::tests::take_control_reader_is_idempotent ... ok
[INFO] [stdout] test runner::channel::tests::take_response_writer_is_idempotent ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_clear_status_noop_when_no_status ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_clear_status_removes_indicator ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_print_does_not_panic ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_print_does_not_panic_with_active_indicator ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_print_does_not_panic_without_indicator ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_progress_creates_indicator_when_tty ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_progress_dropped_when_not_tty ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_progress_saturates_above_100 ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_progress_to_spinner_does_not_panic ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_spinner_to_progress_does_not_panic ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_status_creates_indicator_when_tty ... ok
[INFO] [stdout] test runner::channel::tests::terminal_writer_status_dropped_when_not_tty ... ok
[INFO] [stdout] test runner::pipe::tests::join_provides_happens_before_for_exit_signal_write ... ok
[INFO] [stdout] test runner::pipe::tests::test_dup_pipe_stdout_returns_readable_fd ... ok
[INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_1_sh ... ok
[INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_2_zsh ... ok
[INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_3_python3 ... ok
[INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_4_javascript ... ok
[INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_5_js ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_index::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_index::case_2_python ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_search_with_no_index_returns_empty ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_index::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_search::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_search::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_search::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::all_preambles_end_with_newline ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_index_id_has_index_prefix ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_index_parses_global_option_with_case ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_index_reads_from_fd4 ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_handles_store_put_then_search_round_trip ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_search_error_case_extracts_error_field ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_search_error_case_writes_to_stderr ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_search_error_message_is_prefixed ... ok
[INFO] [stdout] test runner::preamble::tests::bash_creft_search_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::bash_preamble_has_digit_guard_for_progress ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_get_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_put_includes_global_true_when_option_set ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_put_id_has_store_put_prefix ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_put_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_put_uses_creft_escape ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_put_writes_to_fd3 ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_search_id_has_random_component ... ok
[INFO] [stdout] test runner::preamble::tests::bash_store_search_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::node_creft_index_defaults_global_to_false ... ok
[INFO] [stdout] test runner::preamble::tests::node_creft_index_has_early_return_guard ... ok
[INFO] [stdout] test runner::preamble::tests::node_creft_index_reads_sync_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::node_creft_search_error_case_writes_to_stderr ... ok
[INFO] [stdout] test runner::preamble::tests::node_creft_search_error_message_is_prefixed ... ok
[INFO] [stdout] test runner::preamble::tests::node_creft_search_reads_sync_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::node_preamble_contains_all_functions ... ok
[INFO] [stdout] test runner::preamble::tests::node_preamble_creft_exit_defers_exit_until_stdout_drains ... ok
[INFO] [stdout] test runner::preamble::tests::node_preamble_creft_status_accepts_progress_param ... ok
[INFO] [stdout] test runner::preamble::tests::node_preamble_uses_typeof_require_guard ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_get_reads_in_loop_until_newline ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_put_has_early_return_guard ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_put_omits_global_when_not_boolean ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_put_reads_sync_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_put_stringifies_name_key_value ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_search_reads_sync_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::node_store_search_uses_random_id ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_get::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_get::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_get::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_put::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_put::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_put::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_search::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_search::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_search::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_get_type_field_is_store_get::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_get_type_field_is_store_get::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_get_type_field_is_store_get::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_put_type_field_is_store_put::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_put_type_field_is_store_put::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_put_type_field_is_store_put::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_search_type_field_is_store_search::case_1_bash ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_search_type_field_is_store_search::case_2_python ... ok
[INFO] [stdout] test runner::preamble::tests::preamble_store_search_type_field_is_store_search::case_3_node ... ok
[INFO] [stdout] test runner::preamble::tests::python_creft_index_accepts_options_dict ... ok
[INFO] [stdout] test runner::preamble::tests::python_creft_index_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::python_creft_search_error_case_writes_to_stderr ... ok
[INFO] [stdout] test runner::preamble::tests::python_creft_search_error_message_is_prefixed ... ok
[INFO] [stdout] test runner::preamble::tests::python_creft_search_reads_json_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::python_preamble_contains_all_functions ... ok
[INFO] [stdout] test runner::preamble::tests::python_preamble_creft_exit_flushes_stdout ... ok
[INFO] [stdout] test runner::preamble::tests::python_preamble_creft_status_accepts_progress_param ... ok
[INFO] [stdout] test runner::preamble::tests::python_store_get_extracts_value_field ... ok
[INFO] [stdout] test runner::preamble::tests::python_store_get_reads_json_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::python_store_put_omits_global_when_not_in_options ... ok
[INFO] [stdout] test runner::preamble::tests::python_store_put_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::python_store_search_extracts_results_field ... ok
[INFO] [stdout] test runner::preamble::tests::python_store_search_reads_from_fd4 ... ok
[INFO] [stdout] test runner::preamble::tests::unsupported_language_returns_none::case_1_llm ... ok
[INFO] [stdout] test runner::preamble::tests::bash_preamble_contains_all_functions ... ok
[INFO] [stdout] test runner::preamble::tests::unsupported_language_returns_none::case_2_cobol ... ok
[INFO] [stdout] test runner::preamble::tests::unsupported_language_returns_none::case_3_empty ... ok
[INFO] [stdout] test runner::signal::tests::pipe_signal_guard_stores_and_clears_pgid ... ok
[INFO] [stdout] test runner::channel::tests::spawn_reader_handles_store_put_then_get_round_trip ... ok
[INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_1_bash ... ok
[INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_2_sh ... ok
[INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_3_zsh ... ok
[INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_4_python ... ok
[INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_5_node ... ok
[INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_6_ruby ... ok
[INFO] [stdout] test runner::substitute::tests::test_no_shell_escape_node ... ok
[INFO] [stdout] test runner::substitute::tests::shell_escape_neutralizes_subshell_injection::case_2_sh ... ok
[INFO] [stdout] test runner::substitute::tests::shell_escape_neutralizes_subshell_injection::case_3_zsh ... ok
[INFO] [stdout] test runner::substitute::tests::shell_escape_neutralizes_subshell_injection::case_1_bash ... ok
[INFO] [stdout] test runner::substitute::tests::test_no_shell_escape_python ... ok
[INFO] [stdout] test runner::substitute::tests::test_shell_escape_default_with_metachar_not_escaped ... ok
[INFO] [stdout] test runner::substitute::tests::test_shell_escape_default_not_escaped ... ok
[INFO] [stdout] test runner::substitute::tests::test_no_shell_escape_python3 ... ok
[INFO] [stdout] test runner::substitute::tests::test_shell_escape_semicolon_injection ... ok
[INFO] [stdout] test runner::substitute::tests::test_shell_escape_single_quote_in_value ... ok
[INFO] [stdout] test runner::substitute::tests::test_shell_no_escape_for_unknown_lang ... ok
[INFO] [stdout] test runner::substitute::tests::test_shell_escape_empty_string ... ok
[INFO] [stdout] test runner::substitute::tests::test_sponge_substitute_prev_no_shell_escape ... ok
[INFO] [stdout] test runner::substitute::tests::test_sponge_substitute_prev ... ok
[INFO] [stdout] test runner::substitute::tests::test_substitute_basic ... ok
[INFO] [stdout] test runner::substitute::tests::test_substitute_default ... ok
[INFO] [stdout] test runner::substitute::tests::test_substitute_default_overridden ... ok
[INFO] [stdout] test runner::substitute::tests::test_substitute_multiple ... ok
[INFO] [stdout] test runner::substitute::tests::test_substitute_unmatched_passes_through ... ok
[INFO] [stdout] test runner::substitute::tests::test_substitute_no_double_replace ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_1_lowercase ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_2_hyphenated ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_3_multi_hyphen ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_4_already_upper ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_5_mixed_case ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_6_underscore_unchanged ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_7_collision_with_path ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_path_arg_does_not_produce_bare_path_key ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_preserves_order_and_count ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_1_sh ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_2_zsh ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_3_python3 ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_4_javascript ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_5_js ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_6_typescript ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_7_ts ... ok
[INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_8_perl ... ok
[INFO] [stdout] test runner::tests::make_execution_error_exit_code_returns_execution_failed ... ok
[INFO] [stdout] test runner::tests::make_execution_error_signal_returns_execution_signaled ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_empty_input_produces_empty_output ... ok
[INFO] [stdout] test runner::tests::bound_pairs_to_env_empty_value_preserved ... ok
[INFO] [stdout] test runner::tests::prepare_block_script_file_has_correct_extension ... ok
[INFO] [stdout] test runner::tests::prepare_block_script_none_preamble_writes_code_only ... ok
[INFO] [stdout] test runner::tests::prepare_block_script_shebang_only_no_panic ... ok
[INFO] [stdout] test runner::tests::prepare_block_script_shebang_placed_before_preamble ... ok
[INFO] [stdout] test runner::tests::prepare_block_script_shebang_without_preamble_unchanged ... ok
[INFO] [stdout] test runner::channel::tests::handle_store_put_non_store_open_error_does_not_panic ... ok
[INFO] [stdout] test runner::tests::prepare_block_script_some_preamble_prepends_preamble ... ok
[INFO] [stdout] test runner::tests::run_context_env_pairs_returns_str_refs ... ok
[INFO] [stdout] test runner::tests::run_context_is_cancelled_default_false ... ok
[INFO] [stdout] test runner::tests::run_context_is_cancelled_true_after_flag_set ... ok
[INFO] [stdout] test runner::tests::run_context_new_cwd_accessible ... ok
[INFO] [stdout] test runner::tests::run_context_request_cancel_sets_flag ... ok
[INFO] [stdout] test runner::tests::run_context_request_cancel_visible_to_clones ... ok
[INFO] [stdout] test runner::tests::run_context_cancel_shared_across_clone ... ok
[INFO] [stdout] test runner::tests::test_arg_validation_invalid_regex_errors ... ok
[INFO] [stdout] test runner::tests::run_context_clone_shares_cwd_and_env ... ok
[INFO] [stdout] test runner::tests::test_arg_validation_invalid_value_errors ... ok
[INFO] [stdout] test runner::tests::test_check_env_missing_required_var_errors ... ok
[INFO] [stdout] test runner::tests::test_check_env_optional_missing_ok ... ok
[INFO] [stdout] test runner::tests::test_combined_short_flags_bool_only ... ok
[INFO] [stdout] test runner::tests::test_combined_short_with_value ... ok
[INFO] [stdout] test runner::tests::test_e2big_enrichment ... ok
[INFO] [stdout] test runner::tests::test_enrich_io_error_other_errors_passthrough ... ok
[INFO] [stdout] test runner::tests::test_execution_signaled_exit_code ... ok
[INFO] [stdout] test runner::tests::test_arg_validation_valid_value_passes ... ok
[INFO] [stdout] test runner::tests::test_extension_mapping ... ok
[INFO] [stdout] test runner::tests::test_flag_bool_presence ... ok
[INFO] [stdout] test runner::tests::test_flag_equals_syntax ... ok
[INFO] [stdout] test runner::tests::test_flag_string_no_default_absent_skipped ... ok
[INFO] [stdout] test runner::tests::test_flag_string_with_default_used_when_absent ... ok
[INFO] [stdout] test runner::tests::test_flag_validation_invalid_regex_errors ... ok
[INFO] [stdout] test runner::tests::test_flag_validation_invalid_value_errors ... ok
[INFO] [stdout] test runner::tests::test_flag_validation_valid_value_passes ... ok
[INFO] [stdout] test runner::tests::test_optional_arg_no_default_template_errors ... ok
[INFO] [stdout] test runner::tests::test_optional_arg_not_bound_when_absent ... ok
[INFO] [stdout] test runner::tests::test_optional_arg_template_default_fires ... ok
[INFO] [stdout] test runner::tests::test_optional_arg_uses_provided_value ... ok
[INFO] [stdout] test runner::tests::test_optional_arg_with_frontmatter_default ... ok
[INFO] [stdout] test runner::tests::test_optional_flag_no_default_binds_empty ... ok
[INFO] [stdout] hello
[INFO] [stdout] get completed
[INFO] [stdout] test runner::tests::test_multi_block_default_pipes ... ok
[INFO] [stdout] test runner::tests::pipe_chain_block_creft_index_and_search_receive_results ... ok
[INFO] [stdout] test runner::tests::pipe_chain_block_creft_store_get_returns_empty_for_missing_key ... ok
[INFO] [stdout] test runner::tests::single_block_creft_search_receives_response_without_hanging ... ok
[INFO] [stdout] 0
[INFO] [stdout] test runner::tests::test_pipe_block0_fails ... ok
[INFO] [stdout] test runner::tests::test_pipe_chain_multiple_failures ... ok
[INFO] [stdout] 0
[INFO] [stdout] test runner::tests::test_pipe_empty_stdin_payload ... ok
[INFO] [stdout] test runner::tests::test_pipe_last_block_fails_reports_error ... ok
[INFO] [stdout] test runner::tests::test_required_arg_missing_errors ... ok
[INFO] [stdout] test runner::tests::test_pipe_single_block_passthrough ... ok
[INFO] [stdout] test runner::tests::test_unknown_flag_errors ... ok
[INFO] [stdout] got: HELLO
[INFO] [stdout] test runner::tests::test_pipe_three_blocks ... ok
[INFO] [stdout] test runner::tests::test_signal_detection ... ok
[INFO] [stdout] test runner::tests::trace_block_sigint_emits_exit_130 ... ok
[INFO] [stdout] test runner::tests::trace_code_99_emits_failure_record ... ok
[INFO] [stdout] test runner::tests::trace_creft_exit_zero_emits_zero_exit_code ... ok
[INFO] [stderr] Downloading... [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸─────────────────────────────] 50%
[2KOverloaded [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━] 100%
[2KDownloading... [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸─────────────────────────────] 50%
[2KDownloading... [━━━━━━━━━━━━━━╸────────────────────────────────────────────] 25%
[2K⠁ Working...                                                                    
[2Khello
[INFO] [stdout] test runner::tests::test_pipe_broken_pipe_silenced ... ok
[INFO] [stderr] world
[INFO] [stdout] test runner::tests::trace_nonzero_exit_status_propagates_to_record ... ok
[INFO] [stdout] test runner::tests::trace_env_fd_plumbing_subprocess_emits_same_shape ... ok
[INFO] [stdout] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxtest runner::tests::test_pipe_large_stdin_no_deadlock ... ok
[INFO] [stderr] hello from bash
[INFO] [stderr] hello
[INFO] [stderr] world
[INFO] [stderr] hi
[INFO] [stdout] test runner::tests::trace_creft_exit_records_side_channel_code ... ok
[INFO] [stdout] test search::index::tests::build_filter_contains_ngram_hashes ... ok
[INFO] [stdout] test search::index::tests::build_filter_contains_whole_token_hashes ... ok
[INFO] [stdout] test search::index::tests::document_with_no_tokens_excluded_from_token_queries ... ok
[INFO] [stdout] test search::index::tests::build_filter_contains_both_whole_token_and_ngram_hashes ... ok
[INFO] [stdout] test search::index::tests::empty_index_returns_no_results ... ok
[INFO] [stdout] test search::index::tests::empty_index_round_trips_correctly ... ok
[INFO] [stdout] test search::index::tests::empty_query_returns_all_entries ... ok
[INFO] [stdout] test search::index::tests::exact_search_and_semantics_unchanged ... ok
[INFO] [stdout] test runner::tests::trace_no_writer_produces_no_output ... ok
[INFO] [stdout] test search::index::tests::exact_search_not_affected_by_fuzzy_method ... ok
[INFO] [stdout] test runner::tests::trace_single_block_print_twice_counts_two ... ok
[INFO] [stdout] test search::index::tests::exact_search_unchanged_after_combined_filter_build ... ok
[INFO] [stdout] test search::index::tests::from_bytes_rejects_empty_slice ... ok
[INFO] [stdout] test search::index::tests::from_bytes_rejects_trailing_garbage ... ok
[INFO] [stdout] test search::index::tests::len_and_is_empty_reflect_entry_count ... ok
[INFO] [stdout] test search::index::tests::from_bytes_rejects_truncated_data ... ok
[INFO] [stdout] test search::index::tests::multi_token_query_and_semantics ... ok
[INFO] [stdout] test search::index::tests::multi_token_query_matching_single_document ... ok
[INFO] [stdout] test search::index::tests::round_trip_preserves_names_and_descriptions ... ok
[INFO] [stdout] test search::index::tests::round_trip_preserves_entry_count ... ok
[INFO] [stdout] test search::index::tests::round_trip_preserves_search_behavior ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_empty_index_returns_empty ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_empty_query_returns_empty ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_requires_ratio_threshold_not_any_gram ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_short_query_bigrams_match_document_via_shared_bigram ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_single_char_query_returns_empty ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_returns_candidate_for_typo_query ... ok
[INFO] [stdout] test search::snippet::tests::context_at_end_of_document_does_not_overflow ... ok
[INFO] [stdout] test search::index::tests::search_fuzzy_returns_candidate_with_shared_trigrams ... ok
[INFO] [stdout] test search::snippet::tests::context_at_start_of_document_does_not_underflow ... ok
[INFO] [stdout] test search::index::tests::single_token_query_returns_matching_documents ... ok
[INFO] [stdout] test search::snippet::tests::empty_query_terms_returns_empty_vec ... ok
[INFO] [stdout] test search::snippet::tests::context_window_size_controls_line_count::case_3_context_two ... ok
[INFO] [stdout] test search::snippet::tests::fuzzy_snippets_context_lines_work_same_as_extract_snippets ... ok
[INFO] [stdout] test search::snippet::tests::fuzzy_snippets_fallback_to_query_terms_when_no_matched_words ... ok
[INFO] [stdout] test search::snippet::tests::fuzzy_snippets_no_match_returns_empty ... ok
[INFO] [stdout] test search::snippet::tests::fuzzy_snippets_use_matched_words_not_query_terms ... ok
[INFO] [stdout] test search::snippet::tests::matching_is_case_insensitive ... ok
[INFO] [stdout] test search::snippet::tests::matching_is_substring ... ok
[INFO] [stdout] test search::snippet::tests::no_matches_returns_empty_vec ... ok
[INFO] [stdout] test search::snippet::tests::render_highlights_query_terms_in_matching_lines ... ok
[INFO] [stdout] test search::snippet::tests::render_includes_name_and_description ... ok
[INFO] [stdout] test search::snippet::tests::render_multiple_docs_separated_by_blank_line ... ok
[INFO] [stdout] test search::snippet::tests::render_produces_different_output_with_and_without_ansi ... ok
[INFO] [stdout] test search::snippet::tests::render_returns_none_for_empty_results_slice ... ok
[INFO] [stdout] test search::snippet::tests::render_returns_none_when_no_results_have_snippets ... ok
[INFO] [stdout] test search::snippet::tests::context_window_size_controls_line_count::case_1_context_zero ... ok
[INFO] [stdout] test search::snippet::tests::context_window_size_controls_line_count::case_2_context_one ... ok
[INFO] [stdout] test search::snippet::tests::empty_text_returns_empty_vec ... ok
[INFO] [stdout] test search::snippet::tests::render_separates_non_adjacent_snippets_with_ellipsis ... ok
[INFO] [stdout] test search::snippet::tests::render_with_show_namespace_true_includes_namespace_header ... ok
[INFO] [stdout] test model::tests::test_help_text_description_only_first_line ... ok
[INFO] [stdout] test search::snippet::tests::single_match_returns_one_snippet_with_match_line ... ok
[INFO] [stdout] test search::snippet::tests::single_match_with_context_includes_surrounding_lines ... ok
[INFO] [stdout] test model::tests::test_help_text_bool_flag_no_value_hint ... ok
[INFO] [stdout] test search::snippet::tests::two_nearby_matches_within_context_merge_into_one_snippet ... ok
[INFO] [stdout] test search::snippet::tests::render_skips_false_positive_results_but_shows_real_matches ... ok
[INFO] [stdout] test search::snippet::tests::two_distant_matches_produce_two_snippets ... ok
[INFO] [stdout] test search::snippet::tests::render_with_show_namespace_false_omits_namespace_header ... ok
[INFO] [stdout] test search::store::tests::index_path_with_plugin_prefix_returns_dotted_idx ... ok
[INFO] [stdout] test search::store::tests::index_path_root_namespace_returns_root_idx ... ok
[INFO] [stdout] test search::store::tests::index_path_named_namespace_returns_dotted_idx ... ok
[INFO] [stdout] test search::store::tests::load_index_returns_none_for_nonexistent_file ... ok
[INFO] [stdout] test search::store::tests::load_index_returns_none_for_corrupt_bytes ... ok
[INFO] [stdout] test search::store::tests::rebuild_all_indexes_creates_index_for_each_namespace ... ok
[INFO] [stdout] test search::store::tests::rebuild_builtin_index_is_searchable_for_builtin_term ... ok
[INFO] [stdout] test search::store::tests::builtin_index_round_trips_via_load_index ... ok
[INFO] [stdout] test search::store::tests::rebuild_builtin_index_contains_add_entry ... ok
[INFO] [stdout] test search::store::tests::rebuild_namespace_index_excludes_skills_from_other_namespaces ... ok
[INFO] [stdout] test search::store::tests::rebuild_namespace_index_is_queryable_after_write ... ok
[INFO] [stdout] test search::store::tests::remove_in_rebuilds_namespace_index_without_removed_skill ... ok
[INFO] [stdout] test search::store::tests::strip_code_blocks_plain_preserves_docs_block_content ... ok
[INFO] [stdout] test search::store::tests::strip_code_blocks_plain_removes_bash_blocks ... ok
[INFO] [stdout] test search::store::tests::rebuild_builtin_index_returns_empty_for_unknown_term ... ok
[INFO] [stdout] test search::tests::search_all_indexes_combines_results_from_multiple_namespaces ... ok
[INFO] [stdout] test search::tests::search_all_indexes_exact_not_affected_by_fuzzy_path ... ok
[INFO] [stdout] test search::tests::search_all_indexes_false_positive_has_empty_snippets ... ok
[INFO] [stdout] test install_method::tests::detect_exe_with_cargo_home_bin_absent_returns_install_script ... ok
[INFO] [stdout] test search::tests::search_all_indexes_finds_results_in_global_scope ... ok
[INFO] [stdout] test search::tests::search_all_indexes_fuzzy_results_sorted_by_tversky_score_descending ... ok
[INFO] [stdout] test search::tests::search_all_indexes_fuzzy_results_have_non_empty_snippets ... ok
[INFO] [stdout] test search::store::tests::rebuild_namespace_index_creates_index_file_on_disk ... ok
[INFO] [stdout] test search::tests::search_all_indexes_no_fuzzy_candidates_below_threshold_returns_empty ... ok
[INFO] [stdout] test search::tests::search_all_indexes_no_matches_returns_empty_without_error ... ok
[INFO] [stdout] test search::tests::search_all_indexes_returns_empty_when_no_index_files_exist ... ok
[INFO] [stdout] test search::tests::search_all_indexes_returns_matches_from_skill_index ... ok
[INFO] [stdout] test search::store::tests::rebuild_builtin_index_contains_entries_for_all_variants ... ok
[INFO] [stdout] test search::store::tests::strip_code_blocks_plain_emits_no_ansi_for_headers ... ok
[INFO] [stdout] test search::tokenize::tests::empty_text_returns_empty_vec ... ok
[INFO] [stdout] test search::tests::search_all_indexes_returns_snippet_results_not_old_type ... ok
[INFO] [stdout] test search::tests::search_all_indexes_skips_corrupt_files ... ok
[INFO] [stdout] test search::tokenize::tests::duplicate_tokens_deduplicated ... ok
[INFO] [stdout] test search::store::tests::rebuild_all_indexes_creates_builtin_idx ... ok
[INFO] [stdout] test search::tokenize::tests::gram_set_empty_input_is_empty ... ok
[INFO] [stdout] test search::tokenize::tests::gram_set_is_case_insensitive ... ok
[INFO] [stdout] test search::tokenize::tests::gram_set_two_char_input_yields_one_bigram ... ok
[INFO] [stdout] test search::tokenize::tests::hash_token_distinct_tokens_produce_distinct_hashes ... ok
[INFO] [stdout] test search::tokenize::tests::hello_world_produces_two_hashes ... ok
[INFO] [stdout] test search::tokenize::tests::gram_set_produces_expected_grams::case_1_exit ... ok
[INFO] [stdout] test search::tokenize::tests::gram_set_produces_expected_grams::case_2_heredoc ... ok
[INFO] [stdout] test search::tokenize::tests::hash_token_is_deterministic ... ok
[INFO] [stdout] test search::tokenize::tests::min_token_length_two_chars::case_2 ... ok
[INFO] [stdout] test search::tokenize::tests::ngrams_from_token_exactly_three_chars_yields_one_gram ... ok
[INFO] [stdout] test search::tokenize::tests::min_token_length_two_chars::case_1 ... ok
[INFO] [stdout] test search::tokenize::tests::min_token_length_two_chars::case_3 ... ok
[INFO] [stdout] test search::tokenize::tests::hyphen_and_underscore_kept_within_tokens ... ok
[INFO] [stdout] test search::tokenize::tests::ngrams_from_token_four_chars_yields_two_grams ... ok
[INFO] [stdout] test search::tokenize::tests::ngrams_from_token_one_char_yields_nothing ... ok
[INFO] [stdout] test search::tokenize::tests::ngrams_from_token_two_chars_yields_nothing ... ok
[INFO] [stdout] test search::tokenize::tests::ngrams_from_token_yields_sliding_window ... ok
[INFO] [stdout] test search::tokenize::tests::punctuation_boundary_splits_adjacent_words ... ok
[INFO] [stdout] test search::tokenize::tests::punctuation_splits_into_separate_tokens ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_empty_query_returns_zero ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_no_match_returns_zero ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_single_char_query_word_returns_zero ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_single_word_best_match_in_document ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_deduplicates_same_doc_word ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_empty_document_returns_empty_matches ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_empty_query_returns_empty_matches ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_multi_word_returns_one_match_per_query_word ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_returns_best_matching_doc_word ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_empty_document_returns_zero ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_multi_word_averages_per_word_best_scores ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_zero_score_words_excluded_from_matches ... ok
[INFO] [stdout] test search::tokenize::tests::three_word_text_produces_three_hashes ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_deduplicates_across_tokens ... ok
[INFO] [stdout] test search::tokenize::tests::tokenization_is_case_insensitive ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_empty_returns_empty ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_five_char_token_produces_both_gram_sizes ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_multi_word_no_overlap_produces_union ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_short_tokens_after_split_produce_grams ... ok
[INFO] [stdout] test search::tokenize::tests::score_query_with_matches_returns_same_score_as_score_query ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_four_char_token_produces_both_gram_sizes ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_is_case_insensitive ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_whitespace_only_returns_empty ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_two_char_token_produces_one_hash ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_disjoint_grams_returns_zero ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_doc_grams_do_not_penalize ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_identical_strings ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_is_asymmetric ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_no_shared_trigrams_returns_zero ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_partial_recall_query_fully_contained_in_doc ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_typo_five_char_token_shares_trigrams ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_single_substitution_four_char_token_shares_bigram ... ok
[INFO] [stdout] test search::tokenize::tests::tversky_score_typo_returns_partial_score ... ok
[INFO] [stdout] test search::tokenize::tests::whitespace_only_returns_empty_vec ... ok
[INFO] [stdout] test search::xor::tests::all_construction_keys_are_present ... ok
[INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_three_char_token_produces_three_hashes ... ok
[INFO] [stdout] test search::xor::tests::fingerprint8_is_deterministic ... ok
[INFO] [stdout] test search::xor::tests::empty_filter_round_trips_correctly ... ok
[INFO] [stdout] test search::xor::tests::empty_set_rejects_every_query ... ok
[INFO] [stdout] test search::xor::tests::from_bytes_rejects_too_short_input ... ok
[INFO] [stdout] test search::xor::tests::hash_to_positions_each_in_correct_block ... ok
[INFO] [stdout] test search::xor::tests::false_positive_rate_below_one_percent ... ok
[INFO] [stdout] test search::xor::tests::mixsplit_is_deterministic ... ok
[INFO] [stdout] test search::xor::tests::reduce_output_always_in_range ... ok
[INFO] [stdout] test search::xor::tests::round_trip_all_construction_keys_survive ... ok
[INFO] [stdout] test search::xor::tests::duplicate_keys_treated_as_deduplicated_set ... ok
[INFO] [stdout] test search::xor::tests::from_bytes_rejects_truncated_fingerprint_array ... ok
[INFO] [stdout] test search::xor::tests::serialization_byte_length_matches_header_plus_fingerprints ... ok
[INFO] [stdout] test search::xor::tests::single_key_present_and_neighbor_likely_absent ... ok
[INFO] [stdout] test settings::tests::get_returns_none_for_missing_key ... ok
[INFO] [stdout] test settings::tests::iter_is_empty_on_default ... ok
[INFO] [stdout] test settings::tests::iter_returns_all_stored_pairs ... ok
[INFO] [stdout] test settings::tests::known_defaults_and_known_keys_are_in_sync ... ok
[INFO] [stdout] test settings::tests::known_entries_default_description_is_non_empty ... ok
[INFO] [stdout] test settings::tests::known_entries_returns_one_entry_per_known_key ... ok
[INFO] [stdout] test search::xor::tests::round_trip_preserves_false_positive_behavior ... ok
[INFO] [stdout] test settings::tests::known_entries_shows_default_when_key_not_set ... ok
[INFO] [stdout] test settings::tests::load_parses_valid_json_file ... ok
[INFO] [stdout] test settings::tests::load_returns_defaults_when_file_does_not_exist ... ok
[INFO] [stdout] test settings::tests::known_entries_shows_set_value_when_key_is_configured ... ok
[INFO] [stdout] test settings::tests::load_returns_error_for_malformed_json ... ok
[INFO] [stdout] test settings::tests::save_and_load_round_trips_values ... ok
[INFO] [stdout] test settings::tests::save_creates_parent_directories ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_2_telemetry_on ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_1_shell ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_3_telemetry_off ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_4_telemetry_invalid ... ok
[INFO] [stdout] test settings::tests::save_produces_pretty_json_with_shell_key ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_6_unknown_key ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_7_empty_key ... ok
[INFO] [stdout] test settings::tests::set_none_value_is_stored_as_literal_none_string ... ok
[INFO] [stdout] test settings::tests::set_telemetry_invalid_value_error_lists_valid_values ... ok
[INFO] [stdout] test settings::tests::set_unknown_key_error_lists_known_keys ... ok
[INFO] [stdout] test search::xor::tests::large_key_set_all_construction_keys_present ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_02_gemini_directory ... ok
[INFO] [stdout] test setup::tests::detect_systems_github_directory_alone_does_not_trigger_copilot ... ok
[INFO] [stdout] test search::xor::tests::mixsplit_distinct_inputs_distinct_outputs ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_01_gemini_file ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_04_cursor_rules_file ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_03_cursor_directory ... ok
[INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_5_telemetry_empty ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_05_windsurf_directory ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_07_aider_conf_file ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_09_copilot_instructions_file ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_10_codex_agents_file ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_08_aider_conventions_file ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_11_codex_directory ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_12_claude_code_directory ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_content_has_valid_frontmatter ... ok
[INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_06_windsurf_rules_file ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_content_includes_creft_reference ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_creates_file_at_project_path ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_content_has_dynamic_availability_check ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_global_writes_to_home_creft ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_global_no_home_errors ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_writes_correct_content ... ok
[INFO] [stdout] test setup::tests::install_global_no_home_errors::case_2_codex ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_updates_stale_content ... ok
[INFO] [stdout] test setup::tests::ensure_session_skill_is_idempotent ... ok
[INFO] [stdout] test setup::tests::install_global_no_home_errors::case_1_aider ... ok
[INFO] [stdout] test setup::tests::install_global_no_home_errors::case_3_gemini ... ok
[INFO] [stdout] test setup::tests::merge_session_start_hook_errors_on_hooks_non_object ... ok
[INFO] [stdout] test setup::tests::read_modify_write_json_creates_file_when_missing ... ok
[INFO] [stdout] test setup::tests::test_creft_owned_file_classification ... ok
[INFO] [stdout] test setup::tests::merge_session_start_hook_errors_on_root_json_array ... ok
[INFO] [stdout] test setup::tests::test_install_aider_global_creates_conventions_file ... ok
[INFO] [stdout] test setup::tests::read_modify_write_json_errors_on_invalid_json ... ok
[INFO] [stdout] test setup::tests::install_global_no_home_errors::case_4_claude_code ... ok
[INFO] [stdout] test setup::tests::test_detect_no_gemini_when_absent ... ok
[INFO] [stdout] test setup::tests::test_install_claude_code_global_path ... ok
[INFO] [stdout] test setup::tests::read_modify_write_json_preserves_existing_keys ... ok
[INFO] [stdout] test setup::tests::test_install_appends_to_existing_non_creft_file ... ok
[INFO] [stdout] test setup::tests::test_install_claude_code_hook_creates_settings_json ... ok
[INFO] [stdout] test setup::tests::test_install_claude_code_hook_idempotent_no_duplicate ... ok
[INFO] [stdout] test setup::tests::test_install_claude_code_hook_also_writes_skill_fallback ... ok
[INFO] [stdout] test setup::tests::test_install_copilot_global_errors ... ok
[INFO] [stdout] test setup::tests::test_install_cursor_global_errors ... ok
[INFO] [stdout] test setup::tests::test_install_cursor_uses_mdc_extension ... ok
[INFO] [stdout] test setup::tests::test_install_gemini_does_not_write_static_file ... ok
[INFO] [stdout] test setup::tests::test_install_gemini_global_hook ... ok
[INFO] [stdout] test setup::tests::test_install_codex_project_path ... ok
[INFO] [stdout] test setup::tests::test_install_claude_code_hook_merges_preserving_user_hooks ... ok
[INFO] [stdout] test setup::tests::test_install_gemini_project_hook ... ok
[INFO] [stdout] test setup::tests::test_install_gemini_hook_merges_preserving_user_hooks ... ok
[INFO] [stdout] test setup::tests::test_install_codex_global_path ... ok
[INFO] [stdout] test setup::tests::test_install_gemini_hook_idempotent_no_duplicate ... ok
[INFO] [stdout] test setup::tests::test_install_strategy_hook_systems ... ok
[INFO] [stdout] test setup::tests::test_install_strategy_static_file_systems ... ok
[INFO] [stdout] test setup::tests::test_install_skip_current_version ... ok
[INFO] [stdout] test setup::tests::test_install_windsurf_global_errors ... ok
[INFO] [stdout] test setup::tests::test_install_updates_stale_version ... ok
[INFO] [stdout] test setup::tests::test_instructions_contain_discovery_commands ... ok
[INFO] [stdout] test setup::tests::test_install_windsurf_has_frontmatter ... ok
[INFO] [stdout] test setup::tests::test_install_upgrades_old_marker_to_current ... ok
[INFO] [stdout] test setup::tests::test_replace_creft_section_no_heading_appends ... ok
[INFO] [stdout] test setup::tests::test_replace_creft_section_preserves_content_after ... ok
[INFO] [stdout] test setup::tests::test_replace_creft_section_replaces_content ... ok
[INFO] [stdout] test setup::tests::test_system_aliases ... ok
[INFO] [stdout] test setup::tests::test_system_all_includes_gemini ... ok
[INFO] [stdout] test setup::tests::test_system_names_round_trip ... ok
[INFO] [stdout] test shell::tests::detect_creft_shell_overrides_settings ... ok
[INFO] [stdout] test shell::tests::detect_returns_bash_when_shell_is_full_path_bash ... ok
[INFO] [stdout] test shell::tests::detect_returns_fish_when_creft_shell_is_fish_path ... ok
[INFO] [stdout] test shell::tests::detect_returns_none_when_creft_shell_is_none_literal ... ok
[INFO] [stdout] test shell::tests::detect_returns_none_when_shell_is_unset ... ok
[INFO] [stdout] test shell::tests::detect_returns_settings_shell_when_creft_shell_absent ... ok
[INFO] [stdout] test shell::tests::detect_returns_zsh_when_shell_is_bin_zsh ... ok
[INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_1_bash ... ok
[INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_2_sh ... ok
[INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_3_zsh ... ok
[INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_4_fish ... ok
[INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_5_python ... ok
[INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_6_node ... ok
[INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_1_zsh_preference_overrides_bash_block ... ok
[INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_2_bash_preference_overrides_zsh_block ... ok
[INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_3_ignores_preference_for_non_shell_block ... ok
[INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_4_returns_none_when_no_preference ... ok
[INFO] [stdout] test skill_test::assertion::tests::exit_code_assertion::case_1_match_zero ... ok
[INFO] [stdout] test skill_test::assertion::tests::exit_code_assertion::case_2_match_nonzero ... ok
[INFO] [stdout] test skill_test::assertion::tests::exit_code_assertion::case_3_mismatch ... ok
[INFO] [stdout] test skill_test::assertion::tests::exit_code_assertion::case_4_mismatch_nonzero ... ok
[INFO] [stdout] test setup::tests::test_install_creates_parent_directories ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_contains_passes ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_equals_passes ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_json_equals_passes ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_json_subset_fails_when_key_missing ... ok
[INFO] [stdout] test search::tests::search_all_indexes_builtin_match_has_snippets_for_known_term ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_json_subset_passes_when_superset ... ok
[INFO] [stdout] test setup::tests::test_install_replaces_stale_creft_section_in_shared_file ... ok
[INFO] [stdout] test setup::tests::test_replace_creft_section_case_insensitive ... ok
[INFO] [stdout] test shell::tests::detect_returns_none_when_settings_shell_is_none_literal ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_missing_reports_read_error ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_1_scalar_equal ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_2_scalar_not_equal ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_3_object_key_present ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_5_nested_object ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_4_object_key_missing ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_6_array_order_insensitive ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_equals_fails_on_mismatch ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_8_type_mismatch_object_vs_array ... ok
[INFO] [stdout] test skill_test::assertion::tests::json_subset_contract::case_7_array_element_missing ... ok
[INFO] [stdout] test skill_test::assertion::tests::files_absent_passes_when_not_present ... ok
[INFO] [stdout] test skill_test::assertion::tests::files_absent_fails_when_file_exists ... ok
[INFO] [stdout] test skill_test::assertion::tests::stderr_contains_passes_when_present ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_contains_fails_when_needle_absent ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_contains_passes_when_needle_present ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_contains_reports_all_missing_needles ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_json_absent_returns_none ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_json_fails_on_invalid_json ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_json_fails_when_key_missing ... ok
[INFO] [stdout] test skill_test::coverage::tests::missing_block_reported ... ok
[INFO] [stdout] test skill_test::coverage::tests::multiple_blocks_combined_blocks_and_primitives ... ok
[INFO] [stdout] test skill_test::coverage::tests::non_empty_expectations_against_empty_trace_returns_single_diagnostic ... ok
[INFO] [stdout] test skill_test::coverage::tests::primitive_min_count_met ... ok
[INFO] [stdout] test skill_test::coverage::tests::primitive_min_count_not_met ... ok
[INFO] [stdout] test skill_test::coverage::tests::reports_all_failures_in_one_pass ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_file_assertion_covers_all_variants ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_json_does_not_expand_object_keys ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_json_leaves_non_strings_unchanged ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_json_replaces_string_leaves ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_scenario_stdin_json_leaves_expanded ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_scenario_touches_every_leaf_position ... ok
[INFO] [stdout] test skill_test::coverage::tests::primitive_absent_from_trace_fails ... ok
[INFO] [stdout] test skill_test::fixture::tests::after_shell_hook_parses ... ok
[INFO] [stdout] test skill_test::fixture::tests::append_scenario_handles_missing_trailing_newline ... ok
[INFO] [stdout] test skill_test::fixture::tests::append_scenario_preserves_leading_comments ... ok
[INFO] [stdout] test skill_test::fixture::tests::append_scenario_preserves_trailing_comments ... ok
[INFO] [stdout] test skill_test::fixture::tests::append_scenario_round_trips_through_parse_scenarios_str ... ok
[INFO] [stdout] test skill_test::fixture::tests::append_scenario_to_empty_string_creates_single_entry_list ... ok
[INFO] [stdout] test skill_test::assertion::tests::stdout_json_passes_when_subset_matches ... ok
[INFO] [stdout] test skill_test::fixture::tests::append_scenario_to_existing_file_preserves_existing_bytes ... ok
[INFO] [stdout] test skill_test::coverage::tests::empty_expectations_always_passes ... ok
[INFO] [stdout] test skill_test::expand::tests::expand_scenario_with_no_placeholders_round_trips ... ok
[INFO] [stdout] test skill_test::fixture::tests::coverage_blocks_not_list_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::coverage_not_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::coverage_primitives_not_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::coverage_unknown_key_returns_unknown_key_error ... ok
[INFO] [stdout] test skill_test::coverage::tests::block_present_passes ... ok
[INFO] [stdout] test skill_test::fixture::tests::before_shell_hook_parses ... ok
[INFO] [stdout] test skill_test::fixture::tests::coverage_blocks_negative_element_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::discover_filter_does_not_surface_errors_from_unfiltered_files ... ok
[INFO] [stdout] test skill_test::fixture::tests::discover_returns_test_yaml_files_in_lexicographic_order ... ok
[INFO] [stdout] test skill_test::fixture::tests::discover_with_skill_filter::case_1_top_level ... ok
[INFO] [stdout] test skill_test::fixture::tests::discover_filter_foo_returns_both_top_level_and_nested_foo ... ok
[INFO] [stdout] test skill_test::fixture::tests::find_scenario_by_name_returns_none_for_no_match ... ok
[INFO] [stdout] test skill_test::fixture::tests::empty_file_returns_empty_vec ... ok
[INFO] [stdout] test skill_test::fixture::tests::coverage_with_non_creft_argv_parses_successfully ... ok
[INFO] [stdout] test skill_test::fixture::tests::discover_with_skill_filter::case_3_no_match ... ok
[INFO] [stdout] test skill_test::fixture::tests::given_files_json_value_with_float_parses ... ok
[INFO] [stdout] test skill_test::fixture::tests::find_scenario_by_name_returns_some_for_match ... ok
[INFO] [stdout] test skill_test::fixture::tests::discover_with_skill_filter::case_2_nested ... ok
[INFO] [stdout] test skill_test::fixture::tests::given_files_not_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::given_files_map_value_becomes_file_content_json ... ok
[INFO] [stdout] test skill_test::fixture::tests::full_scenario_roundtrip_retains_all_fields ... ok
[INFO] [stdout] test skill_test::fixture::tests::given_files_unknown_key_returns_unknown_key_error ... ok
[INFO] [stdout] test skill_test::assertion::tests::file_regex_passes ... ok
[INFO] [stdout] test search::tests::search_all_indexes_includes_builtin_idx ... ok
[INFO] [stdout] test skill_test::fixture::tests::integer_name_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::inter_entry_comment_attaches_to_previous_entry ... ok
[INFO] [stdout] test skill_test::fixture::tests::inter_entry_blank_line_attaches_to_previous_entry ... ok
[INFO] [stdout] test skill_test::fixture::tests::invalid_yaml_syntax_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::load_file_missing_path_returns_io_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::is_fixture_match_rejects_non_test_yaml_extension ... ok
[INFO] [stdout] test skill_test::fixture::tests::missing_name_returns_missing_field_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::is_fixture_match_with_exact_plain_text_matches_basename ... ok
[INFO] [stdout] test skill_test::fixture::tests::is_fixture_match_with_no_filter_accepts_any_test_yaml ... ok
[INFO] [stdout] test skill_test::fixture::tests::missing_when_argv_returns_missing_field_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::is_fixture_match_with_exact_plain_text_matches_whole_basename ... ok
[INFO] [stdout] test skill_test::fixture::tests::minimal_scenario_with_only_required_fields_parses ... ok
[INFO] [stdout] test skill_test::fixture::tests::missing_when_returns_missing_field_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::is_fixture_match_with_glob_matches_prefix ... ok
[INFO] [stdout] test skill_test::fixture::tests::non_integer_timeout_returns_parse_error::case_2_string_timeout ... ok
[INFO] [stdout] test skill_test::fixture::tests::negative_timeout_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::multiple_scenarios_parsed_in_declaration_order ... ok
[INFO] [stdout] test skill_test::fixture::tests::notes_field_preserved_verbatim_including_newlines ... ok
[INFO] [stdout] test skill_test::fixture::tests::non_integer_timeout_returns_parse_error::case_1_float_timeout ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_str_loads_one_scenario_from_single_entry_list ... ok
[INFO] [stdout] test skill_test::fixture::tests::null_document_returns_empty_vec ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_str_rejects_non_list_top_level ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_yaml_skips_schema_validation ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_yaml_returns_raw_mapping_nodes ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_yaml_rejects_non_list_top_level ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_str_rejects_missing_when_argv ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_does_not_round_trip_through_emitter ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_handles_non_ascii_in_folded_scalar ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_handles_non_ascii_in_block_scalar ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_handles_non_ascii_in_plain_scalar ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_excludes_hyphen_prefixed_scalar_at_base_indent_if_present ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_flow_style_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_out_of_bounds_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_preserves_file_level_comment ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_rejects_document_start_marker::case_1_marker_only ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_rejects_document_start_marker::case_3_marker_crlf_line_ending ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_rejects_document_start_marker::case_2_marker_after_comment ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_rejects_document_start_marker::case_4_marker_trailing_space ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_removes_first_of_two_entries ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_removes_last_of_two_entries ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_removes_middle_of_three ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_removes_only_entry_to_empty_or_header ... ok
[INFO] [stdout] test skill_test::fixture::tests::replace_scenario_out_of_bounds_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::scenario_that_is_not_a_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::section_as_non_mapping_returns_parse_error::case_3_when_not_mapping ... ok
[INFO] [stdout] test skill_test::fixture::tests::section_as_non_mapping_returns_parse_error::case_2_before_not_mapping ... ok
[INFO] [stdout] test skill_test::fixture::tests::replace_scenario_swaps_only_the_named_entry ... ok
[INFO] [stdout] test skill_test::fixture::tests::remove_scenario_at_handles_dash_dash_dash_in_block_scalar ... ok
[INFO] [stdout] test skill_test::fixture::tests::section_as_non_mapping_returns_parse_error::case_5_after_not_mapping ... ok
[INFO] [stdout] test skill_test::fixture::tests::section_as_non_mapping_returns_parse_error::case_1_given_not_mapping ... ok
[INFO] [stdout] test skill_test::fixture::tests::stdin_bare_scalar_returns_parse_error::case_2_boolean ... ok
[INFO] [stdout] test skill_test::fixture::tests::shell_hook_unknown_key_returns_unknown_key_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::stdin_bare_scalar_returns_parse_error::case_3_float ... ok
[INFO] [stdout] test skill_test::fixture::tests::stdin_json_object_parsed_as_stdin_payload_json ... ok
[INFO] [stdout] test skill_test::fixture::tests::stdin_bare_scalar_returns_parse_error::case_1_integer ... ok
[INFO] [stdout] test skill_test::fixture::tests::stdin_list_parsed_as_stdin_payload_json ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_absent_element_not_string_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_exit_code_as_string_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::section_as_non_mapping_returns_parse_error::case_4_then_not_mapping ... ok
[INFO] [stdout] test skill_test::fixture::tests::parse_scenarios_str_loads_zero_scenarios_from_empty_string ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_absent_not_list_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_multiple_assertion_keys_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_not_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_value_not_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_stdout_contains_not_list_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_stdout_json_parsed ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_no_assertion_key_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::top_level_mapping_not_list_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::unknown_then_key_returns_unknown_key_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::then_files_assertion_all_types_parse ... ok
[INFO] [stdout] test skill_test::fixture::tests::timeout_seconds_parsed_as_u64 ... ok
[INFO] [stdout] test skill_test::fixture::tests::when_env_not_mapping_returns_parse_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::step1_entry_count_matches_schema_validator_on_real_fixtures ... ok
[INFO] [stdout] test skill_test::fixture::tests::when_env_value_not_string_returns_parse_error ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::exact_plain_text_ask_does_not_match_task ... ok
[INFO] [stdout] test skill_test::fixture::tests::unknown_top_level_key_returns_unknown_key_error ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::exact_glob_star_is_anchored_at_both_ends ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::exact_plain_text_matches_whole_name_only ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::exact_plain_text_treats_regex_metacharacters_literally ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::exact_name_is_matched_by_equal_pattern_in_both_kinds ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::glob_dot_treated_literally_not_as_regex_wildcard ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::glob_double_star_acts_as_star ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::glob_question_matches_single_char ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_03_exact_plain_rejects_prefix ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_02_exact_plain_rejects_suffix ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::glob_star_in_middle_matches_arbitrary_interior ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_01_exact_plain_matches_self ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_04_sub_plain_matches_self ... ok
[INFO] [stdout] test skill_test::fixture::tests::when_unknown_key_returns_unknown_key_error ... ok
[INFO] [stdout] test skill_test::fixture::tests::when_argv_element_not_string_returns_parse_error ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::exact_glob_star_matches_prefix_names ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::substring_plain_text_does_not_match_when_absent ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_06_sub_plain_matches_suffix ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::substring_plain_text_matches_anywhere_in_name ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_08_exact_glob_rejects_non_prefix ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_10_sub_glob_rejects_non_prefix ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::substring_plain_text_treats_regex_metacharacters_literally ... ok
[INFO] [stdout] test skill_test::placeholder::tests::multiple_placeholders_in_one_string ... ok
[INFO] [stdout] test skill_test::placeholder::tests::placeholder_expanded::case_2_home_placeholder ... ok
[INFO] [stdout] test skill_test::placeholder::tests::placeholder_expanded::case_1_source_placeholder ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_07_exact_glob_matches_prefix ... ok
[INFO] [stdout] test skill_test::placeholder::tests::source_does_not_expand_sandbox_prefix ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_09_sub_glob_matches_prefix ... ok
[INFO] [stdout] test skill_test::placeholder::tests::unknown_placeholder_left_as_literal ... ok
[INFO] [stdout] test skill_test::match_pattern::tests::kind_shape_matrix::case_05_sub_plain_matches_infix ... ok
[INFO] [stdout] test skill_test::sandbox::tests::env_for_child_omits_lang_when_unset ... ok
[INFO] [stdout] test skill_test::sandbox::tests::env_for_child_scenario_env_overrides_parent ... ok
[INFO] [stdout] test skill_test::sandbox::tests::env_for_child_propagates_lang_when_set ... ok
[INFO] [stdout] test skill_test::placeholder::tests::no_placeholders_returns_input_unchanged ... ok
[INFO] [stdout] test skill_test::placeholder::tests::placeholder_expanded::case_3_sandbox_placeholder ... ok
[INFO] [stdout] test skill_test::sandbox::tests::env_for_child_sets_home_and_project_root ... ok
[INFO] [stdout] test skill_test::sandbox::tests::materialise_json_file_produces_pretty_printed_output ... ok
[INFO] [stdout] test skill_test::sandbox::tests::env_for_child_strips_unknown_parent_vars ... ok
[INFO] [stdout] test skill_test::sandbox::tests::drop_removes_dir_by_default ... ok
[INFO] [stdout] test skill_test::sandbox::tests::materialise_creates_parent_directories ... ok
[INFO] [stdout] test skill_test::sandbox::tests::env_for_child_strips_creft_home ... ok
[INFO] [stdout] test skill_test::sandbox::tests::materialise_text_file_written_to_pre_expanded_path ... ok
[INFO] [stdout] test skill_test::sandbox::tests::new_sandbox_creates_source_and_home_under_root ... ok
[INFO] [stdout] test skill_test::sandbox::tests::set_keep_true_preserves_dir_across_drop ... ok
[INFO] [stdout] test skill_test::sandbox::tests::mirror_project_skills_none_is_noop ... ok
[INFO] [stdout] test skill_test::sandbox::tests::materialise_writes_text_content_verbatim ... ok
[INFO] [stdout] test skill_test::sandbox::tests::mirror_project_skills_copies_skill_files ... ok
[INFO] [stdout] test skill_test::sandbox::tests::spawn_shell_runs_in_source_directory ... ok
[INFO] [stdout] test skill_test::sandbox::tests::spawn_shell_propagates_path_from_parent ... ok
[INFO] [stdout] test skill_test::sandbox::tests::spawn_shell_propagates_exit_status ... ok
[INFO] [stdout] test skill_test::sandbox::tests::spawn_shell_runs_with_sandbox_home ... ok
[INFO] [stdout] test skill_test::scenario::tests::before_shell_failure_aborts_scenario ... ok
[INFO] [stdout] test skill_test::sandbox::tests::spawn_shell_strips_unknown_parent_vars ... ok
[INFO] [stdout] test skill_test::scenario::tests::after_shell_runs_even_when_scenario_fails ... ok
[INFO] [stdout] test skill_test::scenario::tests::after_shell_resolves_home_to_sandbox ... ok
[INFO] [stdout] test skill_test::scenario::tests::before_shell_resolves_home_to_sandbox ... ok
[INFO] [stdout] test skill_test::scenario::tests::before_shell_writes_to_sandbox_home_not_operator_home ... ok
[INFO] [stdout] test skill_test::scenario::tests::exit_code_mismatch_reported ... ok
[INFO] [stdout] test skill_test::scenario::tests::keep_on_failure_does_not_set_path_for_passing_scenario ... ok
[INFO] [stdout] test skill_test::scenario::tests::file_assertion_json_subset_with_sandbox_placeholder_passes ... ok
[INFO] [stdout] test skill_test::scenario::tests::keep_on_failure_preserves_sandbox_dir ... ok
[INFO] [stdout] test skill_test::scenario::tests::non_creft_binary_with_coverage_expectation_returns_no_trace_failure ... ok
[INFO] [stdout] test skill_test::scenario::tests::file_assertion_json_subset_passes ... ok
[INFO] [stdout] test skill_test::scenario::tests::execute_scenario_strips_unknown_parent_vars ... ok
[INFO] [stdout] test skill_test::scenario::tests::file_assertion_equals_with_home_placeholder_passes ... ok
[INFO] [stdout] test skill_test::scenario::tests::stdin_text_reaches_child ... ok
[INFO] [stdout] test skill_test::scenario::tests::stdin_text_with_home_placeholder_reaches_child_expanded ... ok
[INFO] [stdout] test skill_test::scenario::tests::stdin_json_with_sandbox_placeholder_reaches_child_expanded ... ok
[INFO] [stdout] test skill_test::scenario::tests::stderr_contains_with_sandbox_placeholder_passes ... ok
[INFO] [stdout] test skill_test::scenario::tests::stdin_json_reaches_child_as_serialised_bytes ... ok
[INFO] [stdout] test skill_test::scenario::tests::stdout_contains_fails_when_absent ... ok
[INFO] [stdout] test skill_test::scenario::tests::stdout_contains_passes_when_present ... ok
[INFO] [stdout] test store::tests::skill_test_fixture_path_for_namespaced_skill ... ok
[INFO] [stdout] test store::tests::skill_test_fixture_path_for_top_level_skill ... ok
[INFO] [stdout] test store::tests::skill_test_fixture_path_rejects_invalid_name ... ok
[INFO] [stdout] test store::tests::test_collect_commands_skips_symlinks ... ok
[INFO] [stdout] test store::tests::collect_commands_excludes_invalid_yaml_frontmatter_file_from_results ... ok
[INFO] [stdout] test store::tests::test_commands_dir_for_uses_scope ... ok
[INFO] [stdout] test store::tests::test_default_write_scope_creft_home_mode_is_global ... ok
[INFO] [stdout] test store::tests::test_default_write_scope_local_root_is_local ... ok
[INFO] [stdout] test store::tests::test_default_write_scope_no_local_root_is_global ... ok
[INFO] [stdout] test store::tests::test_find_local_root_from_finds_creft_at_start ... ok
[INFO] [stdout] test store::tests::test_find_local_root_from_finds_creft_in_parent ... ok
[INFO] [stdout] test store::tests::test_find_local_root_from_returns_none_when_absent ... ok
[INFO] [stdout] test store::tests::test_find_local_root_from_skips_creft_file ... ok
[INFO] [stdout] test store::tests::test_find_parent_local_root_not_found ... ok
[INFO] [stdout] test store::tests::test_find_parent_local_root_found ... ok
[INFO] [stdout] test store::tests::test_find_parent_local_root_skips_start ... ok
[INFO] [stdout] test store::tests::test_global_root_contains_dot_creft ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_deep_nesting ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_drill_in ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_empty ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_mixed_package ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_no_match ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_package_detection ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_single_skill ... ok
[INFO] [stdout] test store::tests::test_group_by_namespace_top_level ... ok
[INFO] [stdout] test store::tests::test_group_skill_name_equals_prefix ... ok
[INFO] [stdout] test store::tests::test_has_local_root_exists ... ok
[INFO] [stdout] test store::tests::test_has_local_root_file_not_dir ... ok
[INFO] [stdout] test store::tests::test_has_local_root_missing ... ok
[INFO] [stdout] test store::tests::test_is_local_source_owned_global ... ok
[INFO] [stdout] test store::tests::test_is_local_source_owned_local ... ok
[INFO] [stdout] test store::tests::test_is_local_source_package_global ... ok
[INFO] [stdout] test store::tests::test_is_reserved ... ok
[INFO] [stdout] test store::tests::test_is_reserved_init ... ok
[INFO] [stdout] test store::tests::test_list_all_with_source_merges_scopes_local_shadows_global ... ok
[INFO] [stdout] test store::tests::test_is_local_source_package_local ... ok
[INFO] [stdout] test store::tests::test_load_in_loads_from_correct_scope ... ok
[INFO] [stdout] test store::tests::test_name_to_path_in_uses_scope ... ok
[INFO] [stdout] test store::tests::test_name_to_path_namespaced ... ok
[INFO] [stdout] test store::tests::test_name_to_path_simple ... ok
[INFO] [stdout] test store::tests::collect_commands_silently_skips_plain_markdown_without_frontmatter ... ok
[INFO] [stdout] test store::tests::test_namespace_exists_false ... ok
[INFO] [stdout] test skill_test::scenario::tests::version_flag_passes_with_stdout_contains ... ok
[INFO] [stdout] test store::tests::test_namespace_exists_true ... ok
[INFO] [stdout] test store::tests::test_resolve_root_creft_home_overrides_both_scopes ... ok
[INFO] [stdout] test store::tests::test_resolve_command_rejects_traversal ... ok
[INFO] [stdout] test store::tests::test_remove_in_deletes_from_correct_scope ... ok
[INFO] [stdout] test store::tests::test_resolve_root_local_scope_falls_back_to_global ... ok
[INFO] [stdout] test store::tests::test_resolve_root_global_scope_returns_global_root ... ok
[INFO] [stdout] test store::tests::test_resolve_root_local_scope_returns_local_root ... ok
[INFO] [stdout] test store::tests::test_validate_name_empty ... ok
[INFO] [stdout] test store::tests::test_validate_name_invalid_chars ... ok
[INFO] [stdout] test store::tests::test_save_to_global_scope_writes_to_global_commands_dir ... ok
[INFO] [stdout] test store::tests::test_save_to_local_scope_writes_to_local_commands_dir ... ok
[INFO] [stdout] test store::tests::test_validate_path_token_accepts_valid ... ok
[INFO] [stdout] test store::tests::test_validate_name_ok ... ok
[INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_1_dot ... ok
[INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_2_dotdot ... ok
[INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_3_slash ... ok
[INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_5_empty ... ok
[INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_4_backslash ... ok
[INFO] [stdout] test store_kv::tests::load_store_index_returns_none_when_file_missing ... ok
[INFO] [stdout] test store_kv::tests::load_store_index_returns_none_for_corrupt_bytes ... ok
[INFO] [stdout] test store::tests::test_validate_name_reserved ... ok
[INFO] [stdout] test skill_test::scenario::tests::coverage_trace_end_to_end_passes_for_matching_expectation ... ok
[INFO] [stderr] done
[INFO] [stdout] test store_kv::tests::put_then_get_returns_inserted_value ... ok
[INFO] [stdout] test store_kv::tests::put_with_global_false_after_global_true_revokes_flag ... ok
[INFO] [stdout] test store_kv::tests::put_multiple_keys_all_retrievable ... ok
[INFO] [stdout] test store_kv::tests::different_qualified_names_use_separate_databases ... ok
[INFO] [stdout] test store_kv::tests::put_with_global_true_then_is_global_returns_true ... ok
[INFO] [stdout] test runner::tests::trace_pipe_chain_bash_python_node_each_primitive ... ok
[INFO] [stdout] test store_kv::tests::rebuild_store_index_on_empty_store_produces_empty_index ... ok
[INFO] [stdout] test store_kv::tests::put_without_global_on_new_store_leaves_flag_false ... ok
[INFO] [stdout] test store_kv::tests::rebuild_then_load_produces_queryable_index ... ok
[INFO] [stdout] test store_kv::tests::put_with_global_none_after_global_true_leaves_flag_unchanged ... ok
[INFO] [stdout] test store_kv::tests::some_value_differs_from_none ... ok
[INFO] [stdout] test store_kv::tests::rebuild_store_index_creates_directory_if_missing ... ok
[INFO] [stdout] test store_kv::tests::store_entries_returns_err_when_file_exists_but_is_corrupt ... ok
[INFO] [stdout] test store_kv::tests::store_dir_for_global_scope_returns_stores_subdir ... ok
[INFO] [stdout] test store_kv::tests::store_entries_returns_empty_vec_for_nonexistent_database ... ok
[INFO] [stdout] test store_kv::tests::store_get_returns_err_when_file_exists_but_is_corrupt ... ok
[INFO] [stdout] test store_kv::tests::store_get_returns_none_when_database_does_not_exist ... ok
[INFO] [stdout] test store_kv::tests::store_index_path_appends_store_idx_extension ... ok
[INFO] [stdout] test store_kv::tests::store_is_global_returns_false_for_nonexistent_database ... ok
[INFO] [stdout] test store_kv::tests::store_is_global_returns_false_when_file_exists_but_is_corrupt ... ok
[INFO] [stdout] test store_kv::tests::search_index_from_store_with_config_key_matches_on_value_content ... ok
[INFO] [stdout] test store_kv::tests::store_path_appends_redb_extension ... ok
[INFO] [stdout] test store_kv::tests::store_path_three_segment_name ... ok
[INFO] [stdout] test style::tests::init_color_no_color_disables_yansi ... ok
[INFO] [stdout] test style::tests::init_color_term_dumb_disables_yansi ... ok
[INFO] [stdout] test style::tests::no_color_env_disables_color ... ok
[INFO] [stdout] test style::tests::paint_disabled_produces_no_ansi ... ok
[INFO] [stdout] test style::tests::paint_enabled_produces_ansi_bold ... ok
[INFO] [stdout] test style::tests::term_dumb_disables_color ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_01_both_unset ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_02_ci_true_no_force ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_03_ci_one_no_force ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_04_ci_false_no_force ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_05_ci_true_force_one ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_06_ci_true_force_true ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_07_ci_true_force_zero ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_08_ci_true_force_false ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_09_ci_true_force_empty ... ok
[INFO] [stdout] test update_check::tests::ci_skip_active_truth_table::case_10_ci_unset_force_one ... ok
[INFO] [stdout] test update_check::tests::date_from_epoch_seconds_produces_correct_date::case_1_epoch ... ok
[INFO] [stdout] test update_check::tests::date_from_epoch_seconds_produces_correct_date::case_2_y2k ... ok
[INFO] [stdout] test update_check::tests::date_from_epoch_seconds_produces_correct_date::case_3_y2025_jan01 ... ok
[INFO] [stdout] test update_check::tests::date_from_epoch_seconds_produces_correct_date::case_4_y2026_dec31 ... ok
[INFO] [stdout] test update_check::tests::date_from_epoch_seconds_produces_correct_date::case_5_before_midnight ... ok
[INFO] [stdout] test update_check::tests::date_from_epoch_seconds_produces_correct_date::case_6_after_midnight ... ok
[INFO] [stdout] test update_check::tests::endpoint_returns_default_when_env_var_unset ... ok
[INFO] [stdout] test update_check::tests::endpoint_returns_env_var_when_set ... ok
[INFO] [stdout] test update_check::tests::is_ci_ignores_vendor_specific_vars ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_1_ci_true ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_2_ci_one ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_3_ci_false ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_4_ci_zero ... ok
[INFO] [stdout] test store_kv::tests::store_is_global_returns_false_when_no_meta_flag_set ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_5_ci_empty ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_6_ci_uppercase_true ... ok
[INFO] [stdout] test update_check::tests::is_ci_returns_false_when_unset ... ok
[INFO] [stdout] test update_check::tests::is_force_check_parses_truthy_values::case_1_force_true ... ok
[INFO] [stdout] test update_check::tests::is_force_check_parses_truthy_values::case_2_force_one ... ok
[INFO] [stdout] test store_kv::tests::store_get_returns_none_for_missing_key_in_existing_store ... ok
[INFO] [stdout] test update_check::tests::is_force_check_parses_truthy_values::case_3_force_false ... ok
[INFO] [stdout] test update_check::tests::is_force_check_parses_truthy_values::case_4_force_empty ... ok
[INFO] [stdout] test update_check::tests::is_force_check_returns_false_when_unset ... ok
[INFO] [stdout] test update_check::tests::latest_response_deserializes_full_payload ... ok
[INFO] [stdout] test update_check::tests::maybe_fire_daily_precondition_chain::case_1_welcome_absent ... ok
[INFO] [stdout] test update_check::tests::is_ci_parses_truthy_values::case_7_ci_all_caps ... ok
[INFO] [stdout] test update_check::tests::maybe_fire_daily_precondition_chain::case_2_ci_true ... ok
[INFO] [stdout] test update_check::tests::maybe_fire_daily_precondition_chain::case_3_telemetry_off ... ok
[INFO] [stdout] test update_check::tests::maybe_fire_daily_precondition_chain::case_4_already_checked_today ... ok
[INFO] [stdout] test update_check::tests::maybe_fire_daily_precondition_chain::case_5_stale_last_check ... ok
[INFO] [stdout] test update_check::tests::os_string_passes_linux_through ... ok
[INFO] [stdout] test update_check::tests::os_string_passthrough::case_1_freebsd ... ok
[INFO] [stdout] test update_check::tests::read_last_check_returns_none_for_blank_or_absent::case_1_missing ... ok
[INFO] [stdout] test update_check::tests::read_last_check_returns_none_for_blank_or_absent::case_2_empty ... ok
[INFO] [stdout] test update_check::tests::read_last_check_returns_none_for_blank_or_absent::case_3_whitespace ... ok
[INFO] [stdout] test store_kv::tests::second_put_replaces_first_value ... ok
[INFO] [stdout] test update_check::tests::latest_response_defaults_optional_fields_to_empty_string ... ok
[INFO] [stdout] test update_check::tests::user_agent_matches_expected_format ... ok
[INFO] [stdout] test update_check::tests::read_last_check_returns_none_for_non_date_content ... ok
[INFO] [stdout] test update_check::tests::user_agent_uses_linux_on_linux ... ok
[INFO] [stdout] test update_check::tests::write_last_check_creates_parent_directories ... ok
[INFO] [stdout] test update_check::tests::write_last_check_round_trips ... ok
[INFO] [stdout] test store_kv::tests::store_entries_returns_all_pairs ... ok
[INFO] [stdout] test store_kv::tests::store_entries_returns_pairs_in_key_order ... ok
[INFO] [stdout] test update_check::tests::write_status_atomic_leaves_no_tmp_file ... ok
[INFO] [stdout] test update_check::tests::write_status_atomic_creates_parent_directories ... ok
[INFO] [stdout] test update_check::tests::write_status_atomic_creates_valid_json ... ok
[INFO] [stdout] test update_notice::tests::is_newer_compares_semver_correctly::case_1_behind ... ok
[INFO] [stdout] test update_notice::tests::ci_guard_suppresses_notice_and_leaves_flag_unflipped ... ok
[INFO] [stdout] test update_notice::tests::is_newer_compares_semver_correctly::case_2_same ... ok
[INFO] [stdout] test update_notice::tests::is_newer_compares_semver_correctly::case_3_ahead ... ok
[INFO] [stdout] test update_notice::tests::is_newer_compares_semver_correctly::case_4_minor_bump ... ok
[INFO] [stdout] test update_notice::tests::is_newer_compares_semver_correctly::case_5_major_bump ... ok
[INFO] [stdout] test update_notice::tests::is_newer_returns_false_for_malformed_input::case_1_empty ... ok
[INFO] [stdout] test update_notice::tests::is_newer_returns_false_for_malformed_input::case_2_partial ... ok
[INFO] [stdout] test update_notice::tests::is_newer_returns_false_for_malformed_input::case_3_letters ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_1_status_file_absent ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_3_newer_version_pending ... ok
[INFO] [stdout] test update_check::tests::today_utc_matches_date_format ... ok
[INFO] [stdout] test update_notice::tests::homebrew_path_selects_brew_upgrade_command ... ok
[INFO] [stdout] test update_notice::tests::is_newer_compares_semver_correctly::case_6_patch_behind ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_2_latest_equals_installed ... ok
[INFO] [stdout] test validate::tests::arg_name_with_space_produces_invalid_chars_error ... ok
[INFO] [stdout] test validate::tests::digit_short_form_produces_error ... ok
[INFO] [stdout] test update_check::tests::maybe_fire_daily_precondition_chain::case_6_last_check_absent ... ok
[INFO] [stdout] test validate::tests::dry_run_is_caught_by_reserved_not_char_check ... ok
[INFO] [stdout] test validate::tests::duplicate_arg_names_produce_error ... ok
[INFO] [stdout] test validate::tests::duplicate_flag_long_names_produce_error ... ok
[INFO] [stdout] test validate::tests::empty_arg_name_produces_error ... ok
[INFO] [stdout] test validate::tests::duplicate_flag_short_forms_produce_error ... ok
[INFO] [stdout] test validate::tests::empty_flag_name_produces_error ... ok
[INFO] [stdout] test validate::tests::empty_short_form_produces_error ... ok
[INFO] [stdout] test validate::tests::flag_and_arg_sharing_name_produce_conflict_error ... ok
[INFO] [stdout] test validate::tests::flag_name_starting_with_digit_produces_error ... ok
[INFO] [stdout] test validate::tests::flag_name_with_slash_produces_invalid_chars_error ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_4_notice_already_shown ... ok
[INFO] [stdout] test validate::tests::flag_name_with_space_produces_invalid_chars_error ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_5_telemetry_off ... ok
[INFO] [stdout] test validate::tests::multichar_short_form_produces_error ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_6_malformed_status_file ... ok
[INFO] [stdout] test validate::tests::no_flags_no_args_passes_cleanly ... ok
[INFO] [stdout] test validate::tests::hyphenated_flag_in_bash_block_emits_env_var_warning ... ok
[INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_1_help ... ok
[INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_2_dry_run ... ok
[INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_3_verbose ... ok
[INFO] [stdout] test validate::tests::hyphenated_flag_with_template_usage_passes_bash_syntax ... ok
[INFO] [stdout] test update_notice::tests::print_if_pending_cases::case_7_current_exe_none ... ok
[INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_4_docs ... ok
[INFO] [stdout] test validate::tests::reserved_short_flag_produces_error::case_2_v ... ok
[INFO] [stdout] test validate::tests::non_hyphenated_flag_in_bash_block_emits_env_var_hint ... ok
[INFO] [stdout] test validate::tests::reserved_short_flag_produces_error::case_1_h ... ok
[INFO] [stdout] test validate::tests::multiple_hyphenated_flags_each_emit_a_warning ... ok
[INFO] [stdout] test validate::tests::reserved_short_flag_produces_error::case_3_cap_v ... ok
[INFO] [stdout] test validate::tests::test_dep_resolution_shell_present ... ok
[INFO] [stdout] test validate::tests::test_bash_placeholder_no_false_positive ... ok
[INFO] [stdout] test validate::tests::test_dep_resolution_skipped_for_unknown_lang ... ok
[INFO] [stdout] test validate::tests::test_description_length_diagnostic_has_no_block_index ... ok
[INFO] [stdout] test validate::tests::test_description_length_no_warn_short ... ok
[INFO] [stdout] test validate::tests::test_description_length_warn_over_80 ... ok
[INFO] [stdout] test validate::tests::test_description_length_no_warn_at_limit ... ok
[INFO] [stdout] test validate::tests::test_display_format_block_no_lang ... ok
[INFO] [stdout] test validate::tests::test_display_format_block_no_lang_with_line ... ok
[INFO] [stdout] test validate::tests::test_display_format_no_block ... ok
[INFO] [stdout] test validate::tests::test_display_format_with_block_lang_line ... ok
[INFO] [stdout] test validate::tests::test_dep_resolution_shell_missing ... ok
[INFO] [stdout] test validate::tests::test_display_format_with_block_lang_no_line ... ok
[INFO] [stdout] test validate::tests::test_empty_blocks ... ok
[INFO] [stdout] test validate::tests::test_endpoint_url_for_npm ... ok
[INFO] [stdout] test validate::tests::test_endpoint_url_for_pypi ... ok
[INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_5_version ... ok
[INFO] [stdout] test validate::tests::test_invalid_bash_produces_error ... ok
[INFO] [stdout] test validate::tests::test_is_clean_false_with_errors_only ... ok
[INFO] [stdout] test validate::tests::test_is_clean_false_with_warnings_only ... ok
[INFO] [stdout] test validate::tests::test_is_clean_true_when_both_empty ... ok
[INFO] [stdout] test validate::tests::test_llm_block_empty_prompt_error ... ok
[INFO] [stdout] test validate::tests::test_llm_block_placeholder_check_works ... ok
[INFO] [stdout] test validate::tests::test_llm_block_prev_placeholder_in_second_block_no_warning ... ok
[INFO] [stdout] test validate::tests::test_llm_block_provider_warning_when_not_on_path ... ok
[INFO] [stdout] test validate::tests::test_invalid_sh_produces_error ... ok
[INFO] [stdout] test validate::tests::test_llm_block_valid_prompt_clean ... ok
[INFO] [stdout] test validate::tests::test_llm_block_skips_syntax_check ... ok
[INFO] [stdout] test validate::tests::test_llm_block_yaml_parse_error_reported ... ok
[INFO] [stdout] test validate::tests::test_multiple_undeclared_placeholders ... ok
[INFO] [stdout] test validate::tests::test_no_placeholders ... ok
[INFO] [stdout] test validate::tests::test_parse_node_errors_empty_ignored ... ok
[INFO] [stdout] test validate::tests::test_parse_node_errors_raw_fallback ... ok
[INFO] [stdout] test skill_test::scenario::tests::timeout_scenario_returns_timeout_status ... ok
[INFO] [stdout] test validate::tests::test_parse_node_errors_with_syntax_error ... ok
[INFO] [stdout] test validate::tests::hyphenated_flag_in_non_shell_block_emits_no_diagnostic ... ok
[INFO] [stdout] test validate::tests::test_parse_shell_errors_empty_stderr_no_errors ... ok
[INFO] [stdout] test validate::tests::test_parse_shell_errors_lineno_one_becomes_some ... ok
[INFO] [stdout] test validate::tests::test_parse_shell_errors_lineno_zero_becomes_none ... ok
[INFO] [stdout] test validate::tests::test_parse_shell_errors_raw_stderr_fallback ... ok
[INFO] [stdout] test validate::tests::test_parse_python_errors_empty_message_ignored ... ok
[INFO] [stdout] test validate::tests::test_parse_python_errors_raw_fallback ... ok
[INFO] [stdout] test validate::tests::test_parse_shell_errors_whitespace_only_no_errors ... ok
[INFO] [stdout] test validate::tests::test_parse_python_errors_with_syntax_error ... ok
[INFO] [stdout] test validate::tests::test_placeholder_prev_in_first_block ... ok
[INFO] [stdout] test validate::tests::test_placeholder_prev_in_later_block ... ok
[INFO] [stdout] test validate::tests::test_parse_shell_errors_structured_plus_fallback_exclusive ... ok
[INFO] [stdout] test validate::tests::test_placeholder_all_declared ... ok
[INFO] [stdout] test validate::tests::test_placeholder_undeclared_no_default ... ok
[INFO] [stdout] test validate::tests::test_invalid_python_produces_error ... ok
[INFO] [stdout] test validate::tests::test_sanitize_placeholders_multiple ... ok
[INFO] [stdout] test validate::tests::test_sanitize_placeholders_shell ... ok
[INFO] [stdout] test validate::tests::test_sanitize_placeholders_with_default ... ok
[INFO] [stdout] test skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block ... FAILED
[INFO] [stdout] test validate::tests::test_sanitize_preserves_non_placeholder_braces ... ok
[INFO] [stdout] test validate::tests::test_placeholder_flags_recognized ... ok
[INFO] [stdout] test validate::tests::test_shellcheck_produces_warnings_for_known_issue ... ok
[INFO] [stdout] test validate::tests::test_shellcheck_skipped_when_syntax_fails ... ok
[INFO] [stdout] test validate::tests::test_sanitize_placeholder_inside_string ... ok
[INFO] [stdout] test validate::tests::test_sub_skill_skipped_when_no_ctx ... ok
[INFO] [stdout] test validate::tests::test_typescript_not_validated ... ok
[INFO] [stdout] test validate::tests::test_unknown_language_no_errors ... ok
[INFO] [stdout] test validate::tests::test_prev_declared_as_arg_still_warns_in_block0 ... ok
[INFO] [stdout] test validate::tests::test_valid_bash_no_errors ... ok
[INFO] [stdout] test validate::tests::test_placeholder_undeclared_with_default ... ok
[INFO] [stdout] test validate::tests::test_valid_sh_no_errors ... ok
[INFO] [stdout] test validate::tests::test_valid_zsh_no_errors ... ok
[INFO] [stdout] test validate::tests::test_which_path_returns_none_for_nonexistent_tool ... ok
[INFO] [stdout] test validate::tests::valid_flag_and_short_passes_cleanly ... ok
[INFO] [stdout] test validate::tests::valid_flag_name_output_passes ... ok
[INFO] [stdout] test validate::tests::validate_skill_accepts_body_with_four_backtick_outer_fence ... ok
[INFO] [stdout] test validate::tests::validate_skill_rejects_body_with_improperly_nested_fences ... ok
[INFO] [stdout] test wrap::tests::wrap_description_continuation_indent_exact ... ok
[INFO] [stdout] test wrap::tests::wrap_description_empty_returns_empty ... ok
[INFO] [stdout] test wrap::tests::wrap_description_first_word_exceeds_first_line_budget_goes_to_continuation ... ok
[INFO] [stdout] test wrap::tests::wrap_description_fits_on_first_line_unchanged ... ok
[INFO] [stdout] test wrap::tests::wrap_description_line_count::case_1_single_word_fits ... ok
[INFO] [stdout] test wrap::tests::wrap_description_line_count::case_2_two_words_fit ... ok
[INFO] [stdout] test validate::tests::test_dep_resolution_empty_deps_no_check ... ok
[INFO] [stdout] test wrap::tests::wrap_description_no_trailing_whitespace_on_any_line ... ok
[INFO] [stdout] test wrap::tests::wrap_description_wraps_when_over_budget ... ok
[INFO] [stdout] test wrap::tests::wrap_description_line_count::case_3_wraps_at_budget ... ok
[INFO] [stdout] test wrap::tests::wrap_description_zero_budget_starts_on_continuation ... ok
[INFO] [stdout] test wrap::tests::wrap_text_blank_lines_preserved_as_paragraph_separators ... ok
[INFO] [stdout] test wrap::tests::wrap_text_empty_string_returns_empty ... ok
[INFO] [stdout] test wrap::tests::wrap_text_at_width_unchanged ... ok
[INFO] [stdout] test wrap::tests::wrap_text_markdown_headers_passed_through ... ok
[INFO] [stdout] test wrap::tests::wrap_text_over_width_wraps_at_space ... ok
[INFO] [stdout] test wrap::tests::wrap_text_preformatted_lines_passed_through ... ok
[INFO] [stdout] test wrap::tests::wrap_text_single_word_over_width_emitted_as_is ... ok
[INFO] [stdout] test wrap::tests::wrap_text_under_width_unchanged ... ok
[INFO] [stdout] test yaml::tests::arg_required_default_is_false ... ok
[INFO] [stdout] test yaml::tests::arg_required_true_extracted ... ok
[INFO] [stdout] test yaml::tests::arg_with_default_extracted ... ok
[INFO] [stdout] test yaml::tests::arg_with_validation_extracted ... ok
[INFO] [stdout] test yaml::tests::command_def_minimal_emits_only_name_and_description ... ok
[INFO] [stdout] test yaml::tests::command_def_missing_description_returns_missing_field_error ... ok
[INFO] [stdout] test yaml::tests::command_def_missing_name_returns_missing_field_error ... ok
[INFO] [stdout] test yaml::tests::command_def_name_wrong_type_returns_type_error ... ok
[INFO] [stdout] test yaml::tests::command_def_not_a_mapping_returns_error ... ok
[INFO] [stdout] test yaml::tests::command_def_required_fields_extracted ... ok
[INFO] [stdout] test wrap::tests::wrap_text_indent_continuation_wraps_at_width_minus_indent ... ok
[INFO] [stdout] test yaml::tests::command_def_supports_extracted ... ok
[INFO] [stdout] test yaml::tests::command_def_supports_roundtrips ... ok
[INFO] [stdout] test yaml::tests::command_def_roundtrip_full ... ok
[INFO] [stdout] test yaml::tests::command_def_tags_extracted ... ok
[INFO] [stdout] test yaml::tests::command_def_unknown_fields_ignored ... ok
[INFO] [stdout] test yaml::tests::command_def_with_arg_extracted ... ok
[INFO] [stdout] test yaml::tests::description_with_colon_space_is_quoted ... ok
[INFO] [stdout] test yaml::tests::description_with_newline_is_quoted_and_roundtrips ... ok
[INFO] [stdout] test validate::tests::test_shellcheck_skipped_for_non_shell_lang ... ok
[INFO] [stdout] test validate::tests::test_sub_skill_skipped_for_python_block ... ok
[INFO] [stdout] test yaml::tests::env_var_required_false_is_explicit_in_emission ... ok
[INFO] [stdout] test yaml::tests::env_var_required_defaults_to_true ... ok
[INFO] [stdout] test yaml::tests::env_var_required_true_omitted_from_emission ... ok
[INFO] [stdout] test yaml::tests::env_var_required_false_extracted ... ok
[INFO] [stdout] test yaml::tests::flag_bool_type_included_in_emission ... ok
[INFO] [stdout] test yaml::tests::flag_default_type_omitted_from_emission ... ok
[INFO] [stdout] test yaml::tests::flag_bool_type_extracted ... ok
[INFO] [stdout] test yaml::tests::flag_short_form_extracted ... ok
[INFO] [stdout] test yaml::tests::flag_type_defaults_to_string_when_absent ... ok
[INFO] [stdout] test yaml::tests::llm_config_defaults_provider_to_claude ... ok
[INFO] [stdout] test yaml::tests::llm_config_empty_document_returns_default ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_plain_identifier_is_false ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_1_hash ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_2_colon_space ... ok
[INFO] [stdout] test yaml::tests::llm_config_provider_extracted ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_4_starts_bracket ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_5_starts_single_quote ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_6_starts_double_quote ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_1_plain_int ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_2_float ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_3_leading_dot ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_4_plus_int ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_5_neg_float ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_6_pos_inf ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_empty_string ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_7_neg_inf ... ok
[INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_8_nan ... ok
[INFO] [stdout] test yaml::tests::package_manifest_all_fields_extracted ... ok
[INFO] [stdout] test yaml::tests::package_manifest_missing_name_returns_error ... ok
[INFO] [stdout] test yaml::tests::package_manifest_missing_description_returns_error ... ok
[INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_3_starts_brace ... ok
[INFO] [stdout] test yaml::tests::package_manifest_optional_fields_absent ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_1_question_mark_space ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_3_pipe_space ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_2_gt_space ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_4_dash_space ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_6_standalone_gt ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_5_standalone_question ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_7_standalone_pipe ... ok
[INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_8_standalone_dash ... ok
[INFO] [stdout] test yaml::tests::package_manifest_missing_version_returns_error ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_3_null_lc ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_4_yes_lc ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_5_no_lc ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_7_off_lc ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_2_false_lc ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_6_on_lc ... ok
[INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_1_true_lc ... ok
[INFO] [stdout] test validate::tests::test_valid_python_no_errors ... ok
[INFO] [stdout] test validate::tests::test_valid_javascript_alias_no_errors ... ok
[INFO] [stdout] test validate::tests::test_invalid_node_produces_error ... ok
[INFO] [stdout] test validate::tests::test_valid_node_no_errors ... ok
[INFO] [stdout] 
[INFO] [stdout] failures:
[INFO] [stdout] 
[INFO] [stdout] ---- skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block stdout ----
[INFO] [stdout] 
[INFO] [stdout] thread 'skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block' (1764) panicked at src/skill_test/scenario.rs:876:13:
[INFO] [stdout] expected Fail for missing block 1; got Timeout stdout="" stderr="coverage check\nfatal runtime error: IO Safety violation: owned file descriptor already closed, aborting\n"
[INFO] [stdout] stack backtrace:
[INFO] [stdout]    0:     0x63548f75b75a - std[fce30c26ee6459b]::backtrace_rs::backtrace::libunwind::trace
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/../../backtrace/src/backtrace/libunwind.rs:117:9
[INFO] [stdout]    1:     0x63548f75b75a - std[fce30c26ee6459b]::backtrace_rs::backtrace::trace_unsynchronized::<std[fce30c26ee6459b]::sys::backtrace::_print_fmt::{closure#1}>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/../../backtrace/src/backtrace/mod.rs:66:14
[INFO] [stdout]    2:     0x63548f75b75a - std[fce30c26ee6459b]::sys::backtrace::_print_fmt
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/sys/backtrace.rs:74:9
[INFO] [stdout]    3:     0x63548f75b75a - <<std[fce30c26ee6459b]::sys::backtrace::BacktraceLock>::print::DisplayBacktrace as core[d17f6591d688f3bd]::fmt::Display>::fmt
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/sys/backtrace.rs:44:26
[INFO] [stdout]    4:     0x63548f776aca - <core[d17f6591d688f3bd]::fmt::rt::Argument>::fmt
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/fmt/rt.rs:152:76
[INFO] [stdout]    5:     0x63548f776aca - core[d17f6591d688f3bd]::fmt::write
[INFO] [stdout]    6:     0x63548f7624c2 - std[fce30c26ee6459b]::io::default_write_fmt::<alloc[dad09f3a48280dba]::vec::Vec<u8>>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/io/mod.rs:621:11
[INFO] [stdout]    7:     0x63548f7624c2 - <alloc[dad09f3a48280dba]::vec::Vec<u8> as std[fce30c26ee6459b]::io::Write>::write_fmt
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/io/mod.rs:1976:13
[INFO] [stdout]    8:     0x63548f732eff - <std[fce30c26ee6459b]::sys::backtrace::BacktraceLock>::print
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/sys/backtrace.rs:47:9
[INFO] [stdout]    9:     0x63548f732eff - std[fce30c26ee6459b]::panicking::default_hook::{closure#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:292:27
[INFO] [stdout]   10:     0x63548f750759 - std[fce30c26ee6459b]::panicking::default_hook
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:316:9
[INFO] [stdout]   11:     0x63548f1d766c - <alloc[dad09f3a48280dba]::boxed::Box<dyn for<'a, 'b> core[d17f6591d688f3bd]::ops::function::Fn<(&'a std[fce30c26ee6459b]::panic::PanicHookInfo<'b>,), Output = ()> + core[d17f6591d688f3bd]::marker::Sync + core[d17f6591d688f3bd]::marker::Send> as core[d17f6591d688f3bd]::ops::function::Fn<(&std[fce30c26ee6459b]::panic::PanicHookInfo,)>>::call
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/alloc/src/boxed.rs:2285:9
[INFO] [stdout]   12:     0x63548f1d766c - test[9653f4f1d2ca1489]::test_main_inner::<test[9653f4f1d2ca1489]::test_main_static::{closure#0}>::{closure#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/test/src/lib.rs:155:21
[INFO] [stdout]   13:     0x63548f7509d2 - <alloc[dad09f3a48280dba]::boxed::Box<dyn for<'a, 'b> core[d17f6591d688f3bd]::ops::function::Fn<(&'a std[fce30c26ee6459b]::panic::PanicHookInfo<'b>,), Output = ()> + core[d17f6591d688f3bd]::marker::Sync + core[d17f6591d688f3bd]::marker::Send> as core[d17f6591d688f3bd]::ops::function::Fn<(&std[fce30c26ee6459b]::panic::PanicHookInfo,)>>::call
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/alloc/src/boxed.rs:2285:9
[INFO] [stdout]   14:     0x63548f7509d2 - std[fce30c26ee6459b]::panicking::panic_with_hook
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:833:13
[INFO] [stdout]   15:     0x63548f732fb8 - std[fce30c26ee6459b]::panicking::panic_handler::{closure#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:698:13
[INFO] [stdout]   16:     0x63548f727b29 - std[fce30c26ee6459b]::sys::backtrace::__rust_end_short_backtrace::<std[fce30c26ee6459b]::panicking::panic_handler::{closure#0}, !>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/sys/backtrace.rs:182:18
[INFO] [stdout]   17:     0x63548f73424d - __rustc[de152adb51f02556]::rust_begin_unwind
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:689:5
[INFO] [stdout]   18:     0x63548f77733c - core[d17f6591d688f3bd]::panicking::panic_fmt
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/panicking.rs:80:14
[INFO] [stdout]   19:     0x63548ec74211 - creft[d22b8a9aa9c989b4]::skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block
[INFO] [stdout]                                at /opt/rustwide/workdir/src/skill_test/scenario.rs:876:13
[INFO] [stdout]   20:     0x63548ec2dfe7 - creft[d22b8a9aa9c989b4]::skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block::{closure#0}
[INFO] [stdout]                                at /opt/rustwide/workdir/src/skill_test/scenario.rs:858:59
[INFO] [stdout]   21:     0x63548ea82d96 - <creft[d22b8a9aa9c989b4]::skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block::{closure#0} as core[d17f6591d688f3bd]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/ops/function.rs:250:5
[INFO] [stdout]   22:     0x63548f1ca94b - <fn() -> core[d17f6591d688f3bd]::result::Result<(), alloc[dad09f3a48280dba]::string::String> as core[d17f6591d688f3bd]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/ops/function.rs:250:5
[INFO] [stdout]   23:     0x63548f1ca94b - test[9653f4f1d2ca1489]::__rust_begin_short_backtrace::<core[d17f6591d688f3bd]::result::Result<(), alloc[dad09f3a48280dba]::string::String>, fn() -> core[d17f6591d688f3bd]::result::Result<(), alloc[dad09f3a48280dba]::string::String>>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/test/src/lib.rs:724:18
[INFO] [stdout]   24:     0x63548f1d813b - test[9653f4f1d2ca1489]::run_test_in_process::{closure#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/test/src/lib.rs:747:74
[INFO] [stdout]   25:     0x63548f1d813b - <core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<test[9653f4f1d2ca1489]::run_test_in_process::{closure#0}> as core[d17f6591d688f3bd]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/panic/unwind_safe.rs:275:9
[INFO] [stdout]   26:     0x63548f1d813b - std[fce30c26ee6459b]::panicking::catch_unwind::do_call::<core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<test[9653f4f1d2ca1489]::run_test_in_process::{closure#0}>, core[d17f6591d688f3bd]::result::Result<(), alloc[dad09f3a48280dba]::string::String>>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:581:40
[INFO] [stdout]   27:     0x63548f1d813b - std[fce30c26ee6459b]::panicking::catch_unwind::<core[d17f6591d688f3bd]::result::Result<(), alloc[dad09f3a48280dba]::string::String>, core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<test[9653f4f1d2ca1489]::run_test_in_process::{closure#0}>>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:544:19
[INFO] [stdout]   28:     0x63548f1d813b - std[fce30c26ee6459b]::panic::catch_unwind::<core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<test[9653f4f1d2ca1489]::run_test_in_process::{closure#0}>, core[d17f6591d688f3bd]::result::Result<(), alloc[dad09f3a48280dba]::string::String>>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panic.rs:359:14
[INFO] [stdout]   29:     0x63548f1d813b - test[9653f4f1d2ca1489]::run_test_in_process
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/test/src/lib.rs:747:27
[INFO] [stdout]   30:     0x63548f1d813b - test[9653f4f1d2ca1489]::run_test::{closure#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/test/src/lib.rs:668:43
[INFO] [stdout]   31:     0x63548f1d1854 - test[9653f4f1d2ca1489]::run_test::{closure#1}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/test/src/lib.rs:698:41
[INFO] [stdout]   32:     0x63548f1d1854 - std[fce30c26ee6459b]::sys::backtrace::__rust_begin_short_backtrace::<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/sys/backtrace.rs:166:18
[INFO] [stdout]   33:     0x63548f1dad42 - std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked::<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/thread/lifecycle.rs:70:13
[INFO] [stdout]   34:     0x63548f1dad42 - <core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}> as core[d17f6591d688f3bd]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/panic/unwind_safe.rs:275:9
[INFO] [stdout]   35:     0x63548f1dad42 - std[fce30c26ee6459b]::panicking::catch_unwind::do_call::<core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}>, ()>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:581:40
[INFO] [stdout]   36:     0x63548f1dad42 - std[fce30c26ee6459b]::panicking::catch_unwind::<(), core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}>>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panicking.rs:544:19
[INFO] [stdout]   37:     0x63548f1dad42 - std[fce30c26ee6459b]::panic::catch_unwind::<core[d17f6591d688f3bd]::panic::unwind_safe::AssertUnwindSafe<std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}>, ()>
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/panic.rs:359:14
[INFO] [stdout]   38:     0x63548f1dad42 - std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked::<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/thread/lifecycle.rs:68:26
[INFO] [stdout]   39:     0x63548f1dad42 - <std[fce30c26ee6459b]::thread::lifecycle::spawn_unchecked<test[9653f4f1d2ca1489]::run_test::{closure#1}, ()>::{closure#1} as core[d17f6591d688f3bd]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/core/src/ops/function.rs:250:5
[INFO] [stdout]   40:     0x63548f759fbf - <alloc[dad09f3a48280dba]::boxed::Box<dyn core[d17f6591d688f3bd]::ops::function::FnOnce<(), Output = ()> + core[d17f6591d688f3bd]::marker::Send> as core[d17f6591d688f3bd]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/alloc/src/boxed.rs:2271:9
[INFO] [stdout]   41:     0x63548f759fbf - <std[fce30c26ee6459b]::sys::thread::unix::Thread>::new::thread_start
[INFO] [stdout]                                at /rustc/b8e88e5ddf5521a9f43ee3f62a702388c713e4bb/library/std/src/sys/thread/unix.rs:118:17
[INFO] [stdout]   42:     0x769e9e741aa4 - <unknown>
[INFO] [stdout]   43:     0x769e9e7cea64 - clone
[INFO] [stdout]   44:                0x0 - <unknown>
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] failures:
[INFO] [stdout]     skill_test::scenario::tests::coverage_trace_end_to_end_fails_for_missing_block
[INFO] [stdout] 
[INFO] [stdout] test result: FAILED. 1808 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.58s
[INFO] [stdout] 
[INFO] [stderr] error: test failed, to rerun pass `--bin creft`
[INFO] running `Command { std: "docker" "inspect" "724a4227f063b9f1076a57936379bb1f88b75f982197b94d873235e1310332b4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "724a4227f063b9f1076a57936379bb1f88b75f982197b94d873235e1310332b4", kill_on_drop: false }`
[INFO] [stdout] 724a4227f063b9f1076a57936379bb1f88b75f982197b94d873235e1310332b4
